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.
});
});
答案 0 :(得分:1)
您可以使用上面的代码,但当然这涉及"检索"来自服务器的文档,然后进行修改并将其保存回来。
如果您有很多并发操作,那么您的结果将不会保持一致,因为"覆盖"试图修改相同内容的另一个操作的工作。所以你的增量可以超出" sync"这里。
更好的方法是使用标准.update()
类型的操作。这些将向服务器发出单个请求并修改文档。甚至返回修改过的文档就像.findByIdAndUpdate()
:
Poll.findByIdAndUpdate(req.params.poll_id,
{ "$inc": { "votes.1": 1 } },
function(err,doc) {
}
);
因此$inc
更新运算符使用"dot notation"完成在指定位置修改数组的工作。该操作是原子操作,因此没有其他操作可以同时修改,如果之前发布了某些内容,则该操作会正确地增加结果,然后通过此操作正确递增,返回结果文档中的正确数据。 / p>