更新嵌套在mongodb中的对象数组中的字符串数组

时间:2018-01-17 08:47:20

标签: arrays node.js mongodb object nested

我想更新一个嵌套在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" : [ 
            ]
        }
    ]
}

1 个答案:

答案 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" } )