想要在文档数组中的对象属性中进行插入
考虑收集m中的文档
{ "_id" : ObjectId("524bfc39e6bed5cc5a9f3a33"),
"x" : [
{ "id":0.0, "name":"aaa"},{ "id":1.0, "name":"bbb"}
]
}
Run Code Online (Sandbox Code Playgroud)
要添加age:100
到{ "id":0.0, "name":"aaa"}
.不仅仅是年龄..但是在数组元素{}中提供upsert.所以它可以包含{age:100,"city":"amd"}
(因为我从应用程序服务获得这个)
正在尝试这个...但没有工作,因为它取代了整个数组元素
db.m.update({_id:ObjectId("524bfc39e6bed5cc5a9f3a33"),
"x" : {
"$elemMatch" : {
"id" : 0.0
}
}},
{
$set : {
"x.$" : {
"age": 100
}
}
},
{upsert: true}
)
Run Code Online (Sandbox Code Playgroud)
将文档更改为(我不想要的)
{ "_id" : ObjectId("524bfc39e6bed5cc5a9f3a33"),
"x" : [
{ "age":100},{ "id":1.0, "name":"bbb"}
]
}
Run Code Online (Sandbox Code Playgroud)
如果不改变架构,这是否可行.
$set : {"x.$" : {"age": 100}}
Run Code Online (Sandbox Code Playgroud)
x.$
将整个匹配的数组元素设置为 {age: 100}
这应该工作:
db.m.update({_id:ObjectId("524bfc39e6bed5cc5a9f3a33"),
"x.id": 0.0}, {$set: {"x.$.age": 100 }});
Run Code Online (Sandbox Code Playgroud)
使用elemMatch
:
db.test.update({x: {$elemMatch: {id: 1}}},{$set: {"x.$.age": 44}})
Run Code Online (Sandbox Code Playgroud)
请注意,upsert
此处的选项是多余的,如果由于位置运算符不支持id
而不存在则无效.x
$
upserting