【问题标题】:Mongoose - Cast to ObjectId failed for value "[object Object]" at path _idMongoose - 路径 _id 的值“[object Object]”转换为 ObjectId 失败
【发布时间】:2013-08-03 06:47:06
【问题描述】:

我有以下架构:

var StorySchema = new Schema({
  title:        { type: String, required: true },
  users:        { 
                  id:        { type: Schema.ObjectId, ref: 'users' },
                  creator:   { type: Boolean } 
                },       
  maxlines:     { type: Number, default: '10'},
  lines:        {
                  text:       { type: String },
                  entered_at: { type: Date }, 
                  user:       {
                                id:   { type: Schema.ObjectId, ref: 'users' }
                              }
                },
  created_date: { type: Date, default: Date.now }, 
  updated_date: { type: Date, default: Date.now },        
})

我有下面的查询:

 exports.view = function (req, res) {  
    Stories
        .findOne({
            _id: req.params.id
        })
        /*.populate('users') */ **<-- If I uncomment this I get the error**
        .exec(function (err, story) {
            if (err) {
                res.json(200, {
                    success: "false",
                    message: err.message
                })
            } else if (story) {
                res.json({
                    sucess: "true",
                    message: story
                })
            } else {
                res.json(200, {
                    sucess: "false",
                    message: "story not found"
                })
            }
        })
}

如上所述,如果我添加 .populate('users') 它会标记以下错误:

{
    "success": "false",
    "message": "Cast to ObjectId failed for value \"[object Object]\" at path \"_id\""
}

我正在调用 /view/51fc2e02576f2dc058000001(它是 stories 表的对象 ID),如果我调用 URL 时没有 .populate('users'),它会返回文档。

用户 -> id 值填充有 ObjectId("51fbe87ec137760025000001") - 这是用户集合中的有效 _id

我看不到我错过了什么?

添加了用户架构

var UserSchema = new Schema({
  name:                 { type: String, required: true },
  email:            { type: String, required: true, unique: true },
  username:         { type: String, required: true, unique: true },
  provider:         { type: String, required: true, enum: ['local', 'facebook']    },
  password:         { type: String, required: true },
  avatar:           { type: String, default: 'http://i.imgur.com/1PtcFos.jpg' },
  gender:           { type: String, required: true, uppercase: true, enum: ['M', 'F'] },
  facebook:         {
                 id:     { type: String }, 
                 token:   { type: String },
                 token_expiry: { type: Date }
                        },
  device:       {
                  token:        { type: String },
                  type:         { type: String, enum: ['ios', 'android'] },
                  badge:        { type: Number },
                  id:           { type: String },
                  created_date: { type: Date, default: Date.now },
                  updated_date: { type: Date, default: Date.now }
                },              
  created_date: { type: Date, default: Date.now },
  updated_date: { type: Date, default: Date.now }              
})

【问题讨论】:

  • 我们可以查看您的用户架构吗?此外,使用 DBRef 没有实际意义,我不确定 mongoose 是否会将其作为三个或两个请求来处理——您可能想研究一下,然后只需 .findOne({_id: userIdOfMatching},fn(err,doc){..}); 作为规则,填充方法通过正确匹配 _id 来工作,这意味着您需要显式设置类型以匹配填充文档的类型。
  • @David - 我在上面添加了用户模式,DBRef 没有做任何事情吗?我以为它告诉 mongoose 要查找 ID 的集合?
  • 你的创作线看起来像这样:Users = module.exports = db.model "users", UserSchema ?
  • 是的,我有mongoose.model('Users', UserSchema),然后是Users = mongoose.model('Users') - 当我使用 `.populate('users.id') 时,@sza 的以下建议似乎有效
  • 那么你的填充应该是.populate('Users')而不是.populate('users')——试试看她是怎么做的。 mongoose toLowerCase() 这很容易,但我不确定他们是否这样做,如果这是解决方案我可能会lul

标签: node.js mongodb express mongoose


【解决方案1】:

我认为你只能做.populate('users.id')Populate 是使用引用Object 来替换id 字段。请看文档。

【讨论】:

  • 这是不正确的,您也可以链接多个填充,.populate('user someOtherDoc andAnotherDoc') 您在架构中标识要匹配的内容,它仅支持文档 _id 即:{type: Schema.ObjectId, rel: "user"}这告诉猫鼬你正在寻找“用户”模式内的_id,类型是Schema.ObjectId,如果你的_id有一个0-1索引,那么你可以做{type: Number ..}或者如果你有一个你可以做的字符串{type: String ..}等等,干杯。
  • 正确,但我不认为它可以应用于子文档,目前users包含一个对象而不是一个字段。
  • 正确,默认情况下无法填充子集合,我不确定您是否可以从其他集合中填充它们?
猜你喜欢
  • 2013-06-17
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 2020-11-10
  • 2015-08-14
  • 2015-07-16
  • 2020-07-28
  • 2021-12-25
相关资源
最近更新 更多