为什么 findOne({ id }) 在 mongoose 6.012 中无法正常工作

问题描述 投票:0回答:9

我正在使用 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" 当我登录时

javascript node.js mongodb express mongoose
9个回答
1
投票

我面临着同样的问题,这就是我解决获取我正在寻找的 Id 的数据的方法。

const ObjectId = require('mongodb').ObjectId;

const id = '61929f3efc232d63cd9dcb6b';

user.findOne({ _id: ObjectId(id) })
.then((result) => {
 console.log(result);
})
.catch((err) => {
 console.log(err);
});

这是我的用户信息数据

Users information data

输出:

{
  _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
}

1
投票

我今天遇到了同样类型的问题,并通过社区指南解决了它。

我用这些简单的代码解决了这个问题。也许你也可以尝试一下。这里我用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);
})

0
投票

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');

0
投票

尝试:

await User.findOne({ _id: mongoose.Types.ObjectId(id) });

0
投票

尝试一下,我希望这会起作用:

const {id} = req.params

await User.findOne({_id: ObjectId(id)})

0
投票

您可以通过添加以下代码开始调试问题,并尝试检查 mongoose 查询是否传递了您传递的所有参数:

mongoose.set('debug', true);

我也遇到了类似的问题,我能够通过以下方式解决它 使用 _id 更新架构,如下所示:

_id:  mongoose.Types.ObjectId

0
投票

我使用 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


0
投票

希望能成功

const { id } = req.params;
const user = await User.findById({ _id: id });

0
投票

如果您按 ID 查询,请使用

findById
而不是
findOne
,如 文档 所示:

const user = await User.findById(mongoose.Types.ObjectId(id));
© www.soinside.com 2019 - 2024. All rights reserved.