我正在使用 mongoose 通过 id 查找一个用户,但它无法正常工作。我尝试了几种不同的方法,但只得到了错误的结果或错误。
这是我的代码。
const { id } = req.params;
const user = await User.findOne({ id });
console.log(id);
console.log(user);
return res.redirect("back");
我尝试了以下方法
1 -
await User.findOne({ id });
返回第一个用户,无论 id 是什么。
target id: a8fc083f3f55494fa2cadf9
{
_id: new ObjectId("618fb03e37876d1f0bccb945"),
name: 'bohetefyhy',
email: '[email protected]',
dataRealm: new ObjectId("618fb0119eefb1308fe65610"),
role: 'user',
createdAt: 2021-11-13T12:31:58.846Z,
updatedAt: 2021-11-15T08:03:34.422Z,
__v: 0
}
2 -
await User.findOne({ id: id });
返回与上面 (1) 相同的结果。
3 -
await User.findOne({ _id: id });
给出错误。
CastError: Cast to ObjectId failed for value "a8fc083f3f55494fa2cadf9" (type string) at path "_id" for model "User"
at model.Query.exec (C:\Users\khan\Documents\Projects\030FL014_Windshield\app\node_modules\mongoose\lib\query.js:4545:21)
at model.Query.Query.then (C:\Users\khan\Documents\Projects\030FL014_Windshield\app\node_modules\mongoose\lib\query.js:4644:15)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
我还注意到结果中缺少猫鼬添加的 id 字段。对于 _id 值是新的 ObjectId("618fb03e37876d1f0bccb945") 而不是简单的 "618fb03e37876d1f0bccb945"
我正在使用
“猫鼬”:“^6.0.12”,
MongoDB 5.0.3 2008R2Plus SSL(64 位)
好的,所以我发现了问题,我的对象 ID 中只有 23 个字符,从一开始就缺少一个。但仍然为什么有 id 字段缺少猫鼬添加以及为什么 _id 是 new ObjectId("618fb03e37876d1f0bccb945") 而不是简单的 "618fb03e37876d1f0bccb945" 当我登录时
我面临着同样的问题,这就是我解决获取我正在寻找的 Id 的数据的方法。
const ObjectId = require('mongodb').ObjectId;
const id = '61929f3efc232d63cd9dcb6b';
user.findOne({ _id: ObjectId(id) })
.then((result) => {
console.log(result);
})
.catch((err) => {
console.log(err);
});
这是我的用户信息数据
输出:
{
_id: new ObjectId("61929f3efc232d63cd9dcb6b"),
name: 'Ibrahem',
email: '[email protected]',
age: 24,
createdAt: 2021-11-15T17:56:14.089Z,
updatedAt: 2021-11-15T17:56:14.089Z,
__v: 0
}
我今天遇到了同样类型的问题,并通过社区指南解决了它。
我用这些简单的代码解决了这个问题。也许你也可以尝试一下。这里我用Email试了一下,你可以用_id试一下。我发现它们都有效。
const router = require('express').Router();
const userModel = require('../models/usermodel');
router.post('/api/user/registration', async (req, res) => {
const emailX = req.body.email;
const emailExist = await userModel.findOne({'email': emailX }); // Finding the Email exist or not
console.log(emailX, "Email Exist: =>", emailExist);
})
Mongoose 的 findById 方法将 id 参数转换为模型的 _id 字段的类型,以便它可以正确查询匹配的文档。
也尝试检查一下
if (id.match(/^[0-9a-fA-F]{24}$/)) {
// Yes, it's a valid ObjectId, proceed with `findById` call.
}
或
var mongoose = require('mongoose');
mongoose.Types.ObjectId.isValid('your id here');
尝试:
await User.findOne({ _id: mongoose.Types.ObjectId(id) });
尝试一下,我希望这会起作用:
const {id} = req.params
await User.findOne({_id: ObjectId(id)})
您可以通过添加以下代码开始调试问题,并尝试检查 mongoose 查询是否传递了您传递的所有参数:
mongoose.set('debug', true);
我也遇到了类似的问题,我能够通过以下方式解决它 使用 _id 更新架构,如下所示:
_id: mongoose.Types.ObjectId
我使用 mongodb 版本 v6.0.0,这对我有用。
const User = mongoose.model("User", userSchema);
const userID="123123123123";
User.findOne({ _id: userID }, function (err, foundItem) {
console.log("foundItem: "+foundItem);
}
用户 ID 类型:String
希望能成功
const { id } = req.params;
const user = await User.findById({ _id: id });
如果您按 ID 查询,请使用
findById
而不是 findOne
,如 文档 所示:
const user = await User.findById(mongoose.Types.ObjectId(id));