2017-05-18 66 views
0

陣列我的文檔集的「消息」數組字段:條件推到MongoDB中

{ 
    "id": 2, 
    "messages": [ 
     { 
     "id": 1, 
     "text": "foo" 
     }, 
     { 
     "id": 2, 
     "text": "bar" 
     } 
    ] 
} 

我想更新文件:添加一個新的「消息」文件的「消息」字段只有當「消息」不包含具有這種id的文檔時。例如:

{ 
    "id": 2, 
    "text": "bllllllll" 
} 

不應該添加

{ 
    "id": 3, 
    "text": "foo" 
} 

應加

我該怎麼辦有條件追加?我知道我可以通過$ elemMatch操作符在查找部分中過濾文檔,但它只能用於更新,使用Upsert它將不再起作用。

回答

0

要根據條件將數據推入數組中,您必須在查詢中使用$ ne。

var data = { 
     "id": 3.0, 
     "text": "bllllllll" 
    } 

假設您想要將數據更新到數組中,如果該ID不在該數組中。

db.getCollection('local').update({ 
    _id: ObjectId("591d6d2091b1fda9dcb6ef69"), 
    "messages.id":{$ne: data.id} 
    },{$push:{messages: data}}) 

$ ne匹配,如果data.id存在於數組中,則忽略更新,否則將數據推入數組。

+0

謝謝,它的工作原理,但條件是在更新的「查詢」(過濾器)部分。如果我傳遞upsert:true,我將在消息字段中獲取帶有此消息的新文檔,我希望條件位於「更新」(修改)部分,而「查詢」(過濾器)只包含_id條件。可能嗎? –

+0

我並沒有完全明白你想說什麼。你可以詳細說明你的代碼嗎? –

0

爲了在一定條件下推動陣列中的元素匹配$addToSet是一個好方法。如果條件匹配,它會將元素推入數組中,確保不會與此推送重複,這意味着如果推送的元素已經存在,它將不會推送它。這有助於在upsert:true的情況下。

db.getCollection('nndemo').update({_id:ObjectId("591d9517faa19dd56df09502")}, 
{$addToSet:{arr:{a:2}}},{upsert:true})