Mongodb 3.6.0-rc3阵列过滤器无法正常工作?

时间:2017-11-10 15:10:26

标签: arrays mongodb mongodb-query

我尝试在mongodb 3.6.0-rc3中使用数组过滤器,与doc example完全相同,但不会影响任何行,也没有错误。

简化了示例。我知道这可以用$作为位置运算符来完成,但是我可以将这个功能用于两个级别的嵌套数组。

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

有人试过这个吗?

3 个答案:

答案 0 :(得分:7)

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

  

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

     

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

     

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

因此,如果您想要“使用”候选版本,请使用该版本的捆绑mongo shell,或者只是通过任何标准驱动程序运行代码。

答案 1 :(得分:0)

这个BUG,只需将studio-3t版本升级到2018.6.1,使用$和arrayFilter即可。我在mongo4.0.4和studio-3t中尝试过

答案 2 :(得分:0)

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