2014-10-21 2 views
0

내가이MongoDB를이 : 특정 필드

{ _id: 1 some_property: some_value items: [{ item_id: item1 item_properties: [{ key1: val1, key2: val2 }] }] }

내가 ITEM_ID = itemX로 새로운 아이템을 얻을 때, 내가하고 싶습니다과 같은 데이터 모델이 존재하지 않는 경우에만 배열에 항목을 삽입 이 item_id가있는 항목이 items 배열에 있는지 확인하십시오. 그것이 없으면 삽입하십시오. 존재하는 경우 item_properties를 기존 item_properties에 추가하고 싶습니다.

$addToSet을 사용해 보았지만, item_id 자체가 아닌 전체 항목을 고려했습니다. 결과는 같은 item_id를 가진 2 개의 아이템이었습니다.

어떻게하면이 원자 적으로 달성 할 수 있습니까?

덕분에, Aliza

답변

0

다음 코드는 원자 적으로 실행할 수 있습니다, 나는 생각한다.

function doWhenItemExisted() { 
    var n = db.c.update({ 
     "items.item_id" : itemX 
    }, { 
     $pushAll: { // I think item_properties of given item is also an array 
      "items.$.item_properties" : item.item_properties 
     } 
    }).nModified; 
    if (!n) { 
     doWhenItemNotExisted(); 
    } 
} 

function doWhenItemNotExisted() { 
    var n = db.c.update({ 
     "items.item_id" : { 
      $ne : itemX 
     } 
    }, { 
     $push: { 
      "items" : item 
     } 
    }).nModified; 
    if (!n) { 
     doWhenItemExisted(); 
    } 
} 

// entry 
doWhenItemExisted();