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

标签 arrays node.js mongodb object nested

我想更新嵌套在对象数组中的字符串数组。

这是我的 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/

相关文章:

python - 如何解开数组?

javascript - 您可以自动将产品从在线商店添加到 WooCommerce 吗?

javascript - 如何就地更新 JSON key ?

node.js - Web 服务 (bpel) 和非结构化数据组合

python - 删除 json 数组转换为元组后出现的逗号

javascript - 使用 lodash 过滤两个字符串数组

javascript - Highchart生成数组系列

node.js - 使用express.js 在浏览器中下载 PDF 文件不正确(已损坏)

mongodb - 通过查询删除数百万个文档时,对 ReplicaSet 有什么影响?

java - 使用java在mongodb中自动递增序列