Mongoose findOneAndUpdate嵌套文档

时间:2016-01-20 00:08:29

标签: node.js mongoose

我试图更新包含2个其他文档的文档。要完成此任务,我使用findOneAndUpdate,但是猫鼬会向我发送CastErrorCast to ObjectId failed)。

我的模特:

user.js的

var userSchema = new Schema({
    email: String,
    info: {
        type : Schema.ObjectId,
        required : true,
        ref : 'Info'
    }
});
module.exports = mongoose.model('User', userSchema);

info.js

var infoSchema = new Schema({
    firstname: String,
    lastname: String
});
module.exports = mongoose.model('Info', infoSchema);

我的查询:

var tmp = {
    email: req.body.email,
    info: {
        name: req.body.info.name
    }
};

User.findOneAndUpdate({
    _id: req.params.id
}, tmp, {
    upsert: false,
    new: true
}).exec(function(err, doc) {
    /* check errors */
    /* send response */
});

我做错了什么?我的模特设置不当吗?

1 个答案:

答案 0 :(得分:0)

  

CastError:强制转换为ObjectId

info的类型是Schema.ObjectId,而一个对象

info: {
    name: req.body.info.name
}

作为ObjectId传递给它,结果失败了。

这可能是一个解决方法。

var new_info = new Info({
    firstname: req.body.info.name.firstname, //
    lastname: req.body.info.name.lastname    //     
});

new_info.save(function(err, doc) {
    if (err)
        console.log(err);
    else {
        var tmp = {
            email: req.body.email,
            info: doc._id
        }

        User.findOneAndUpdate({
            _id: req.params.id
        }, tmp, {
            upsert: false,
            new: true
        }).exec(function(err, doc) {
            //
        });         
    }
});