mongodb upsert更新数组元素

shr*_*hrw 5 mongodb

想要在文档数组中的对象属性中进行插入

考虑收集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)

如果不改变架构,这是否可行.

c.P*_*.u1 6

$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

  • 根据官方文档,无法通过 upsert 使用 $:https://docs.mongodb.com/manual/reference/operator/update/positional/ (2认同)