2011-03-17 2 views
4

이것은 일반적인 데이터베이스 질문과 같지만 NodeJs + MongoDb의 현재 컨텍스트에서 질문 할 것입니다.NodeJs와 MongoDb와 관련된이 코드가 실패 할 수 있다고 생각합니다. 어떻게 수정합니까?

id가 "xyz"인 보편적 인 카운터가 있다고 가정 해 보겠습니다. 여기에 최신의 수를 가져오고 1을 증가하는 코드의 조각이다 :

collection.find({id: "xyz"}, 
    function(err, currentCount) { 
    collection.update({id: "xyz"}, 
     {$inc: {count: 1}}, 
     function(err, data) { 
      cb(currentCount); 
     } 
    } 
} 

두 개의 클라이언트가 동시에이 코드를 호출하려는 경우 문제는, 다음 두 클라이언트가 동일한 수를 얻을 수있다가, 컬렉션은 카운트를 두 번 업데이트합니다. 이 문제를 해결하는 방법?

답변

3

$ inc는 원자 적이며 위험하지 않습니다. 그것은 작동하지 않는 바깥 쪽 찾기에서 지키고 있습니다.

collection.update({id: "xyz"}, 
    {$inc: {count: 1}}, 
    function(err, data) { 
     cb(data); 
    } 
} 

가능성이 있습니다.

0

findAndModify를 사용하면 개체를 수정하고 업데이트 된 버전을 반환합니다. 이렇게하면 각 호출자가 증가 된 값을 얻게됩니다.

collection.findAndModify({id: 'xyz' }, ['_id'], {$inc: {count: 1}}, 
     function (err, data) { 
      cb(data); 
     }); 
관련 문제