【问题标题】:Mongodb, incrementing value inside an array. (save() ? update() ?)Mongodb,在数组中递增值。 (保存()?更新()?)
【发布时间】:2014-10-02 10:44:29
【问题描述】:
var Poll = mongoose.model('Poll', {
title: String,
votes: {
    type: Array,
    'default' : []
}
});

我的简单投票具有上述架构,但我不确定更改投票数组中元素值的最佳方法。

app.put('/api/polls/:poll_id', function(req, res){
Poll.findById(req.params.poll_id, function(err, poll){

// I see the official website of mongodb use something like
// db.collection.update()
// but that doesn't apply here right? I have direct access to the "poll" object here.

Can I do something like
poll.votes[1] = poll.votes[1] + 1; 
poll.save() ?

Helps much appreciated.

});
});

【问题讨论】:

    标签: node.js mongodb mongodb-query


    【解决方案1】:

    您可以像上面那样使用代码,但这当然涉及从服务器“检索”文档,然后进行修改并将其保存回来。

    如果您有很多并发操作执行此操作,那么您的结果将不会一致,因为很有可能“覆盖”另一个尝试修改相同内容的操作的工作。因此,您的增量可能会在此处不“同步”。

    更好的方法是使用标准的.update() 类型的操作。这些将向服务器发出单个请求并修改文档。甚至像.findByIdAndUpdate()一样返回修改后的文档:

    Poll.findByIdAndUpdate(req.params.poll_id,
        { "$inc": { "votes.1": 1 } },
        function(err,doc) {
    
        }
    );
    

    因此,$inc 更新运算符使用"dot notation" 完成了在指定位置修改数组的工作。该操作是原子的,因此没有其他操作可以同时修改,如果在此之前发布了某些内容,那么结果将由该操作正确递增,然后也由该操作递增,在结果文档中返回正确的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 2021-12-05
      • 2011-03-02
      • 2015-11-17
      • 2011-09-16
      • 1970-01-01
      相关资源
      最近更新 更多