【问题标题】:Mongoose embedded document updatingMongoose 嵌入式文档更新
【发布时间】:2011-12-21 13:49:07
【问题描述】:

我遇到了嵌入式文档更新问题。

我定义的架构:

var Talk = new Schema({
    title: {
        type: String,
        required: true
    },
    content: {
        type: String,
        required: true
    },
    date: {
        type: Date,
        required: true
    },
    comments: {
        type: [Comments],
        required: false
    },
    vote: {
        type: [VoteOptions],
        required: false
    },
});

var VoteOptions = new Schema({
    option: {
        type: String,
        required: true
    },
    count: {
        type: Number,
        required: false
    }
});

现在我想用给定的Talk id 和VoteOption id 更新vote.count++。我有以下功能来完成这项工作:

function makeVote(req, res) {

    Talk.findOne(req.params.id, function(err, talk) {
        for (var i = 0; i < talk.vote.length; i++) {
            if (talk.vote[i]._id == req.body.vote) {
                talk.vote[i].count++;

            }
        }
        talk.save(function(err) {
            if (err) {
                req.flash('error', 'Error: ' + err);
                res.send('false');
            } else {
                res.send('true');
            }
        });
    });
}

一切都执行了,我取回了res.send('true'),但计数的值没有改变。

当我做一些console.log 时,我看到它改变了值,但talk.save 只是没有将它保存在数据库中。

我也很不满意这个循环只是为了找到嵌入式文档的_id。在 mongoose 文档中,我读到了关于 talk.vote.id(my_id) 的信息,但这给了我没有 id 函数的错误。

【问题讨论】:

    标签: javascript mongodb node.js mongoose


    【解决方案1】:

    当更新Mixed 类型(这似乎不是基本类型,因此也包括嵌入文档)时,必须在文档上调用.markModified。在这种情况下,它将是:

    talk.markModified("vote"); // mention that `talk.vote` has been modified
    
    talk.save(function(err) {
        // ...
    });
    

    希望这对将来的某人有所帮助,因为我无法很快找到答案。


    Reference:

    ... Mongoose 失去了自动检测/保存这些更改的能力。要“告诉”Mongoose Mixed 类型的值已更改,请调用文档的 .markModified(path) 方法,将路径传递给您刚刚更改的 Mixed 类型。

    【讨论】:

      【解决方案2】:

      这是因为您试图在触发递增计数的回调之前保存您的谈话对象。另外,你确定实例化你的谈话模式了吗?例如:

      var talk = new Talk();
      

      但是,如果您只想增加计数变量,mongo 支持原子的就地更新,您可能会发现这很有用:

      talk.find( { _id : req.body.vote }, { $inc: { count : 1 } } );
      

      看看: http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc

      【讨论】:

        猜你喜欢
        • 2014-06-12
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 2011-12-04
        • 2017-06-22
        相关资源
        最近更新 更多