Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays mongo在数组中添加或更新对象_Arrays_Mongodb_Mongodb Query - Fatal编程技术网

Arrays mongo在数组中添加或更新对象

Arrays mongo在数组中添加或更新对象,arrays,mongodb,mongodb-query,Arrays,Mongodb,Mongodb Query,我有一份文件: { _id: ObjectId("5af06ec792e0fd001f86661d"), 'company': 'ABC', 'profile_set' : [ { 'name' : 'nick', 'options' : 0 }, { 'name' : 'joe', 'options' : 2 }, { 'name' : 'burt', 'options' : 1 } ] } 如果名称不存在,或者如果名称存在,则希望向概要

我有一份文件:

{ _id: ObjectId("5af06ec792e0fd001f86661d"), 
 'company': 'ABC', 
 'profile_set' :
   [
     { 'name' : 'nick', 'options' : 0 },
     { 'name' : 'joe',  'options' : 2 },
     { 'name' : 'burt', 'options' : 1 }
   ] 
}
如果名称不存在,或者如果名称存在,则希望向概要文件集添加新文档,然后更新现有文档

因此,在本例中,如果我尝试添加:

{'name':'matt','options':0}

它应该添加它,但是添加

{'name':'nick','options':8}

应该更新名为nick的对象,因为该对象已存在名为
nick
的对象,并且它将其他字段值更新为新对象

db.coll.update(
    {_id: id, 'profile_set.name': {$ne: 'nick'}}, 
    {$push: {profile_set: {'name': 'nick', 'options': 8}}})
上述命令仅在它不存在时添加它。我如何修改它,以便在它存在时使用新值更新它

更新: 我想如上所述查找并更新任何包含以下内容的文档:
“company”:“ABC”

您想要的是在同一服务器请求中向不存在的位置和“匹配”数组元素发出操作:

db.coll.bulkWrite([
  { "updateMany": {
    "filter": { company: "ABC", "profile_set.name": "nick" },
    "update": {
      "$set": { "profile_set.$.options": 8 }
    }
  }},
  { "updateMany": {
    "filter": { "company": "ABC", "profile_set.name": { "$ne": "nick"} },
    "update": {
       "$push": { 
         "profile_set": { "name": "nick", "options": 8 }
       }
    }
  }}
])

在variant操作下是
“updateMany”
,它实际上与
“multi”:true
选项或
updateMany()
方法相同,只是我们以“批处理”方式发布。

使用
.bulkWrite()
并发布这两个操作,试图匹配和
$set
索引和
$push
,就像你在它不存在的地方一样。@NeilLunn你能给出一个完整的例子吗?正在搜索以前的答案,但没有用,尽管我确信我以前添加过一个。“哦,好吧,反正现在的票数不多了。”@NeilLunn事实上,我想对任何符合条件的文档执行相同的操作。我更新了问题。好,如果不存在,第一个操作会添加,但第二个操作不会更新先前添加的操作。这是有意的吗?因为如果存在的话,我想更新现有的。@jacky我真的不在乎。你可以把它们调换一下,事实上我可能应该这样做。MongoDB实际上并不“修改”它发现的任何值。它只是匹配,然后什么也不做。我将改变答案中的顺序,但正如前面所说的,这在更广泛的方案中并没有太大的区别。