【问题标题】:Mongodb 3.6.0-rc3 array filters not working?Mongodb 3.6.0-rc3 数组过滤器不起作用?
【发布时间】:2018-04-23 20:41:40
【问题描述】:

我正在尝试在 mongodb 3.6.0-rc3 中使用数组过滤器,就像在 doc example 中一样,但不会影响任何行并且没有错误。

示例已简化。我知道这可以使用 $ 作为位置运算符来完成,但我计划将此功能用于两级嵌套数组。

db.getCollection('books').update({},
    {
        $set: { "authors.$[element].firstName": "Joe" }
    },
    {
        arrayFilters: [ { element: { "_id": ObjectId("some_id") } } ],
        multi: true
    })

有人试过吗?

【问题讨论】:

  • 您认为提供的答案中是否有某些内容无法解决您的问题?如果是这样,请对答案发表评论,以澄清究竟需要解决哪些尚未解决的问题。如果它确实回答了您提出的问题,请注意Accept your Answers您提出的问题

标签: arrays mongodb mongodb-query


【解决方案1】:

你是在 robomongo 中输入这个吗?它看起来像它!如果是这样就行不通了。阅读我在 Updating a Nested Array with MongoDB 上的说明,我说这在“旧 shell”或任何基于它的东西(robomongo 是基于 shell 的构建)中不起作用,因为当前实现了 shell 辅助方法:

注意有点讽刺的是,由于这是在 .update() 和类似方法的“选项”参数中指定的,因此语法通常与所有最新发布的驱动程序版本兼容。

但是mongo shell 并非如此,因为该方法在那里实现的方式(“具有讽刺意味的是,为了向后兼容”)arrayFilters 参数无法被解析选项的内部方法识别和删除为了提供与先前 MongoDB 服务器版本的“向后兼容性”和“遗留”.update() API 调用语法。

因此,如果您想在mongo shell 或其他“基于 shell”的产品(尤其是 Robo 3T)中使用该命令,您需要来自开发分支或生产版本的 3.6 或更高版本的最新版本。

因此,如果您想“玩”这个候选版本,要么使用捆绑的 mongo shell 与该版本,要么简单地通过任何标准驱动程序运行您的代码。

【讨论】:

  • 谢谢@NeilLunn。我首先在 Robo 3T 1.1.1 中尝试并得到:No array filter found for identifier 'element' in path 'authors.$[element].firstName' 然后在 MongoDB shell 版本 v3.6.0-rc3 中:WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
  • @SenadMehic 英语在这里可能是个问题。 在 RoboMongo 中不起作用。请改用mongo shell。另见Update nested subdocuments in MongoDB with arrayFilters。并检查db.version(),因为您可能更新了外壳而不是服务器。必须是 3.6 rc 或大于 3.5.12 的开发版本
  • 谢谢,这解决了我的问题,但不知何故,这个错误在 robo3T 中只弹出了几次,同样的查询运行了几次,一直保持我看到 Updated 0 record(s) 或 @ 987654336@ 虽然没有通过 robo3T 更新!!
【解决方案2】:

这个BUG,把studio-3t版本升级到2018.6.1,用$和arrayFilter就OK了。我在mongo4.0.4和studio-3t试试

【讨论】:

    【解决方案3】:
    db.getCollection('books').update({},
        {
            $set: { "authors.$[element].firstName": "Joe" }
        },
        {
            arrayFilters: [ { "element._id": ObjectId("some_id") } ],
            multi: true
        })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      相关资源
      最近更新 更多