2013-09-21 150 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

这是我见过流星最彻底解释的答案之一。你解释这个的方式真棒!甚至没有解决我的问题,但无论如何感谢! –