2014-10-02 39 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"指定位置的陣列的工作。該操作是原子操作,所以沒有其他操作可以同時進行修改,並且如果之前發佈了某些內容,那麼結果會被該操作正確增加,然後也會被該操作遞增,從而在結果文檔中返回正確的數據。