我想更新嵌套在对象数组中的字符串数组。
这是我的 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" : [
]
}
]
}
最佳答案
在 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 deployments have the following default featureCompatibilityVersion values: [...] For deployments upgraded from 3.4: "3.4" until you setFeatureCompatibilityVersion to "3.6".
因此,您需要运行一次以下命令来释放 3.6 的强大功能:
db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } )
关于arrays - 更新嵌套在 mongodb 对象数组中的字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48296949/