调用 findOne 并填充时,转换为 objectid 的值失败
Posted
技术标签:
【中文标题】调用 findOne 并填充时,转换为 objectid 的值失败【英文标题】:Cast to objectid failed for value when calling findOne and populate 【发布时间】:2017-03-17 13:02:14 【问题描述】:我正在使用 Mongoose 创建一个 Mongodb 数据库,其表结构类似于下面列出的 Group.js 文件中的表结构。当我的代码调用 findOne 时,我收到下面列出的转换错误:
值 \" FirstName: 'John',\n MiddleName: null,\n LastName: 'Doe'\n Address: '1234 Anywhere St.' 的转换失败\" 在路径 \"_id\"
Group.js(模型文件)
let UserSchema = mongoose.Schema(
FirstName: String,
MiddleName: String,
LastName: String,
Address: String
);
let User = mongoose.model(‘User', UserSchema);
let GroupSchema = mongoose.Schema(
name: type: String,
groupType: String,
users: [UserSchema]
);
module.exports = mongoose.model('Group', GroupSchema);
GroupRepository.js(获取组及其关联用户列表的方法调用)
findGroupPopulateUsers(paramList, cb)
this.group.findOne(paramList).populate('users').exec(function (err, entity)
if (!err)
cb(err, entity);
else
cb(err);
);
在注入 GroupRepository 类之前声明组模型
const user = require('../models/Group');
这是我传递给 findGroupPopulateUsers 方法调用的 paramList
"groupType": "free"
我对触发此错误的原因感到困惑?我试图遵循文档。在处理子文档人口的猫鼬网站上。请让我知道我在关于如何填充子文档的规则中遗漏了什么?
这是我注意到的一件奇怪的事情,所以子文档似乎返回了,如果我不指定“.populate(....)”方法调用,我不会收到错误消息。但是,如果我尝试访问用户子文档的“_id”字段,它会不断返回未定义。
【问题讨论】:
您可以将您的 paramList 添加到您的问题中吗? 会的。我将添加到代码部分的底部。 您可以为用户和组架构添加一个示例文档吗? 维杰你什么意思? 【参考方案1】:我认为你应该为 findOne 函数添加 .lean()。
this.group.findOne(paramList).populate('users').lean().exec(function (err, entity)
if (!err)
cb(err, entity);
else
cb(err);
);
【讨论】:
试了之后问题依旧。我仍然注意到删除“.populate('Users')”调用时没有收到错误消息。但是,用户子文档中不存在“_id”字段。 我认为 _id 是默认为每个集合自动生成的,还是不包括子文档?以上是关于调用 findOne 并填充时,转换为 objectid 的值失败的主要内容,如果未能解决你的问题,请参考以下文章
由于 Mongoose findOne 中的值错误,转换为 ObjectId 失败
CastError:在 findOne 和其他中,模型“Users”的路径“_id”处的值“0”(类型字符串)转换为 ObjectId 失败