【问题标题】:updating embedded sub documents - mongoose更新嵌入的子文档 - mongoose
【发布时间】:2014-11-28 18:37:25
【问题描述】:

我有以下架构:

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?有回复

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

如果需要更多信息来提供帮助,请告诉我。

谢谢。

【问题讨论】:

  • 从您的 findOne 调用链中删除 lean()。如果要保存对文档的更改,则需要一个完整的模型实例。

标签: node.js mongodb


【解决方案1】:

正如 Johnny 所说,您应该删除对 Query 的精益方法的调用。

这样你的代码看起来像

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 模型实例中。顺便说一句,save 也在 Model 实例中。

【讨论】:

    猜你喜欢
    • 2014-06-12
    • 2023-03-10
    • 2011-12-21
    • 1970-01-01
    • 2020-06-07
    • 2018-09-04
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多