2014-10-21 4 views
0

У меня есть модель данных, которая выглядит как этотMongoDB: вставить элемент в массив только если определенное поле нет

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

, когда я получить новый элемент с item_id = itemX, я хотел бы проверьте, находится ли элемент с этим item_id в массиве элементов. Если его нет, тогда вставьте его. Если он присутствует, я хотел бы добавить item_properties к существующим item_properties.

Я пробовал использовать $addToSet, но это рассматривает весь элемент, а не item_id. Таким образом, результат состоял из 2 элементов с одним и тем же item_id.

Любая идея, как я могу достичь этого атомарно?

Спасибо, 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(); 
Смежные вопросы