【问题标题】:Update an array of strings nested within an array of objects in mongodb更新嵌套在 mongodb 对象数组中的字符串数组
【发布时间】:2018-06-26 02:07:28
【问题描述】:

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

这是我的 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 });

当前输出:

正确更新了团队数组的第 0 个元素,但没有遍历其他对象。

我也试过 $[], teams.assignedModels

预期输出:

{
    "_id" : ObjectId("5a52d995734d1d388d17eb0b"),
    "teams" : [ 
        {
            "assignedModels" : [ 
                "5a1665a82c7eb90001a7d676"
            ]
        }, 
        {
            "assignedModels" : [ 
            ]
        }
    ]
}

【问题讨论】:

  • 您使用的是哪个版本的 MongoDB?
  • mongod 版本:3.4.10 (MMAPv1) (Mlab)

标签: arrays node.js mongodb object nested


【解决方案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”,直到您 将FeatureCompatibilityVersion 设置为“3.6”。

所以你需要运行一次以下命令来释放 3.6 的力量:

db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } )

【讨论】:

  • “没有办法很好地做到这一点” - 这仍然是真的吗?
  • @ghosh:正如我在上面所写的,对于 MongoDB 3.4,没有好的方法。从 3.6 开始,这可以像我上面描述的那样很好地完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多