2013-08-20 47 views
2

我知道我不能一起使用upsert和位置操作符,但是我正在尋找附加到數組,如果我插入的對象的某些字段不匹配某個現有對象中的某些字段陣列。

因此,如果我有下面的現有文檔,我想檢查'field'字段的值,如果字段匹配,則更新/替換該子文檔,如果不匹配,則簡單追加到數組。

{ 
    myArray:[ 
     { 
      field:'xyz' 
     }  
    ] 
} 

有沒有一種很好的方法可以在node.js中做到這一點?我正在使用本機驅動程序。

回答

5

我不認爲你可以在單個查詢中做到這一點。您可以使用本機驅動程序中的兩個單獨查詢來完成此操作。第一個查詢會嘗試更新數組中的字段。如果在數組中找不到匹配的文檔,它將調度第二個查詢以將文檔附加到數組。

db.collection('coll').update({_id: _id, "myArray": {field: "xyz"}}, {"$set": {"myArray.$": {field: "xyzt"}}}, {upsert: true}, function(err, res) { 
    if (err && err.code == 16836) { // no document was matched 
     db.collection('coll').update({_id: _id}, {"$push": {myArray: {field: "xyzt"}}}, function(err, res) { 
      console.log("Inserted document in array"); 
     }); 
    } 
    console.log("Updated document in array"); 
});