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实际上并不“修改”它发现的任何值。它只是匹配,然后什么也不做。我将改变答案中的顺序,但正如前面所说的,这在更广泛的方案中并没有太大的区别。