2013-09-21 94 views
2
在陣列中的子文檔的場

我有以下的MongoDB結構UPSERT通過索引MongoDB中

{ 
    _id : ..., 
    other_stuff ... , 
    my_array : [ 
    { title: ...., body: ...., email: .... }, 
    { title: ...., body: ...., email: .... }, 
    { title: ...., body: ...., email: .... } 
    ] 
} 

我需要在子文檔更新/或插入(如果不是存在的)稱爲「click_number」字段在「my_array」字段中。如果「click_number」字段不存在,請插入字段並將其設置爲1;如果存在,則增加1.

首先,我不知道如何更新數組元素的索引,其次,我不知道如何更新或插入取決於存在的領域。我感謝你的幫助

回答

4

您想在您的收藏使用update命令如下(舉例):

db.collection.update(
    { "my_array.title" : "title_one" }, 
    { $inc : { "my_array.$.click_number" : 1 } } 
); 

剛剛發生了什麼?

update的第一個參數上,您定義了一個query以匹配您希望更新的文檔。我們搜索名爲my_array的名爲title的屬性。當然,您可以將bodyemail與點符號修改爲:"my_array.email"

第二個參數定義更新,即要應用的修改。我們有一個$inc運算符來增加字段,我們在這個語句中使用。 query選擇具有匹配數組元素的文檔。您可以使用$表示法來匹配此匹配的數組項。 "my_array.$"選擇匹配的數組元素,其具有title,emailbody。如果您嘗試爲非現有字段賦予價值,MongoDB將爲您提供幫助。如果該字段不存在,則$inc將該字段設置爲指定的數量。 $inc運營商接受正增量和負增量。

Learn more about the update command.

又如:

db.collection.update(
    { _id : "john", "my_array.email" : "email" }, 
    { $inc : { "my_array.$.click_number" : 1 } } 
); 
+1

這是我見過流星最徹底解釋的答案之一。你解釋這個的方式真棒!甚至沒有解決我的問題,但無論如何感謝! –