2017-04-11 1 views
1

MongoDB does not allow 단일 작업으로 배열의 항목을 바꿉니다. 대신 푸시 동작이 뒤 따른다.MongoDB - 중첩 된 배열의 항목을 대체합니다.

아쉽게도 병렬 요청 (분산 환경)의 배열에있는 동일한 항목 (예 : 2x 당기기 실행 후 2x 푸시)로 경쟁 조건이 발생하는 경우가 있습니다. 중복 된 항목이 표시됩니다 (예 :

{ 
    "_id": ..., 
    "nestedArray": [ 
     { 
      "subId": "1" 
     }, 
     { 
      "subId": "1" 
     }, 
     { 
      "subId": "2" 
     } 
    ] 
} 

해결 방법이 있습니까?

답변

1

나는 보통이 상황에 대해 낙관적 잠금을 사용합니다. 이 작업을 준비하려면 모델에 버전 필드를 추가해야합니다.이 필드는 해당 모델을 수정할 때마다 증가합니다. 그럼 당신은이 방법을 사용 :

Model.findOneAndUpdate(
     {$and: [{_id: <current_id>}, {version: <current_version>}]}, 
     {nestedArray: <new_nested_array>}) 
    .exec(function(err, result) { 
    if(err) { 
     // handle error 
    } 
    if(!result) { 
     // the model has been updated in the mean time 
    } 
    // all is good 
}); 

이는 당신 모델을 얻고 새로운 배열 <new_nested_array>을 계산하기 위해 먼저해야합니다. 이렇게하면 특정 버전에 대해 단 하나의 수정 만 수행 될 수 있습니다. 희망, 나 자신을 설명했다.

+0

MongoDB가 여전히 SQL 캠프에서 싫어하는 것 같아요. :) 전에는 그런 해결책을 생각해 냈지만 옳지 않다고 느꼈습니다. 감사합니다. –

+0

MongoDB를 사용하기위한 전체 접근법을 변경해야합니다. 귀하의 요구 사항을 알지 못하지만 아마도 MongoDB와 함께 사용할 수있는 Redis를 조사하고 거래를 지원하려고 시도 할 것입니다. – enrichz

관련 문제