我有以下架构:
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?
处有回复解决方案建议在父模式之前声明子模式,这是我的情况。
如果需要更多信息,请告知我们。
感谢。
答案 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实例中。