我想更新一个嵌套在Objects数组中的字符串数组。
这是我的Mongo文件:
{
"_id" : ObjectId("5a52d995734d1d388d17eb0b"),
"teams" : [
{
"assignedModels" : [
"5a1665a82c7eb90001a7d676",
"58d8fc2d734d1d5af6dd4803"
]
},
{
"assignedModels" : [
"58d8fc2d734d1d5af6dd4803"
]
}
]
}
现在我想从每个团队对象的assignedModels中删除 “58d8fc2d734d1d5af6dd4803” 字符串。
我已经尝试了一些查询,但没有任何工作正如我预期的那样
当前查询:
db.collection('organisations').updateMany(
{ _id: database.ObjectID("5a52d995734d1d388d17eb0b") ,'teams.assignedModels' : { $exists:true } },
{ $pull : {'teams.$.assignedModels' : "58d8fc2d734d1d5af6dd4803" } },
{ multi: true });
当前输出:
正确更新了teams数组的第0个元素,但没有遍历其他对象。
我尝试了 $ [],teams.assignedModels 以及
预期输出:
{
"_id" : ObjectId("5a52d995734d1d388d17eb0b"),
"teams" : [
{
"assignedModels" : [
"5a1665a82c7eb90001a7d676"
]
},
{
"assignedModels" : [
]
}
]
}
答案 0 :(得分:1)
在MongoDB 3.4中,没有办法很好地做到这一点。您需要迭代元素(客户端)并逐个更新所有内容。或者您可以多次运行以下查询(直到没有更新更新):
db.collection('organisations').updateMany(
{ _id: database.ObjectID("5a52d995734d1d388d17eb0b"), 'teams.assignedModels': "58d8fc2d734d1d5af6dd4803" },
{ $pull : {'teams.$.assignedModels' : "58d8fc2d734d1d5af6dd4803" } }
);
对于MongoDB 3.6,您可以这样做:
db.collection('organisations').updateMany(
{ _id: database.ObjectID("5a52d995734d1d388d17eb0b") },
{ $pull : {'teams.$[].assignedModels' : "58d8fc2d734d1d5af6dd4803" } }
);
但是,如果您将MongoDB v3.4更新为v3.6(已记录在案here},则会有一个问题:
3.6部署具有以下默认featureCompatibilityVersion值:[...]对于从3.4升级的部署:" 3.4"直到你 setFeatureCompatibilityVersion to" 3.6"。
因此,您需要运行以下命令一次以释放3.6电源:
db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } )