更新嵌入式子文档 - mongoose

时间:2014-11-28 04:22:17

标签: node.js mongodb

我有以下架构:

var reviewSchema = new mongoose.Schema({
comments     : String,
rating       : String,
submitted_date: {type: Date, default: Date.now},
numAgreed    : Number,
numDisagreed : Number
});

var userSchema = new mongoose.Schema({
    firstName    : String,
    lastName     : String,
    numRatings   : Number,
    averageRating: Number,
    reviews      : [reviewSchema]
});

我正在为每次审核实施一个协议功能(增加了同意审核的人数),如下所示:

exports.processAgree = function(req,res){
var firstName = req.body.firstName;
var lastName = req.body.lastName;
var index = req.body.index;

User.findOne({firstName:firstName,lastName:lastName}).lean().exec(function(err,user) {
    if (err) {
        throw err;
    }
    else{
        user.reviews[index].numAgreed++;

        user.markModified('reviews');

        user.save(function (err) {
            if (err) throw err;

         });

    }

});

};

然而,我收到错误:

reviewedUser.markModified('reviews');
                     ^
TypeError: Object #<Object> has no method 'markModified'

我通过stackoveflow搜索并看到了对此问题的回复,但它们不适用于我的情况。例如。在How to update an embedded document within an embedded document in mongoose?

处有回复

解决方案建议在父模式之前声明子模式,这是我的情况。

如果需要更多信息,请告知我们。

感谢。

1 个答案:

答案 0 :(得分:0)

正如Johnny所说,你应该在Query上删除对lean方法的调用。

这样你的代码就像

User.findOne({firstName:firstName,lastName:lastName}).exec(function(err,user) {
    if (err) {
        throw err;
    }
    else{
        user.reviews[index].numAgreed++;

        user.markModified('reviews');

        user.save(function (err) {
            if (err) throw err;
        });
    }
});

Lean用于从Mongoose方法中删除对象的所有服务方法和属性。如果您不在Query对象上使用lean方法,Mongoose将返回Model的实例。 Mongoose doc on lean()

您正在寻找的markModified方法驻留在Mongoose Model实例中。顺便说一下,save也在Model实例中。