2014-10-02 3 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"를 사용하여 지정된 위치에 배열을 수정하는 작업을 수행합니다. 연산은 원 자성이므로 다른 연산은 동시에 수정할 수 없으며 그 직전에 발행 된 것이 있으면 결과는 해당 연산에 의해 올바르게 증분되고 결과 문서에 올바른 데이터가 반환됩니다.

관련 문제