2014-10-02 41 views
0
var Poll = mongoose.model('Poll', { 
title: String, 
votes: { 
    type: Array, 
    'default' : [] 
} 
}); 

我有我的简单民意调查的上述模式,我不确定最好的方法来改变我的投票数组中的元素的值。Mongodb,增加数组内的值。 (save()?update()?)

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. 

}); 
}); 

回答

1

你可以为你有以上,当然,这涉及到从服务器“检索”的文件,然后进行修改并保存返回的代码。

如果您在执行此操作时有很多并发操作,那么结果并不一致,因为“覆盖”尝试修改相同内容的另一个操作的工作的可能性很大。所以你的增量可以在这里不再“同步”。

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

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

    } 
); 

所以$inc更新操作者确实在修改使用"dot notation"指定位置的阵列的工作。该操作是原子操作,所以没有其他操作可以同时进行修改,并且如果之前发布了某些内容,那么结果会被该操作正确增加,然后也会被该操作递增,从而在结果文档中返回正确的数据。