调用 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 失败

mongoose.findOne() 后数组被清除

有引用时不调用 Mongoose 模型填充回调

有引用时不调用 Mongoose 模型填充回调

js中直接输出一个object对象显示的是[object Objec