【问题标题】:Why does MongoDB's positional operator ($[]) fail on a Windows machine but work on a Mac?为什么MongoDB位置运算符($ [])在Windows机器上失败但在Mac上工作?
【发布时间】:2017-12-19 23:42:59
【问题描述】:

我在名为 users 的 MongoDB 集合中有以下数据:

{
    "_id" : ObjectID("5a3903562cdc59fad5fdc098"),
    "name" : "Ana",
    "hobbies" : [
        {
            "title" : "kissing",
            "with" : "pets"
        },
        {
            "title" : "playing",
            "with" : "pets"
        },
        {
            "title" : "sleeping",
            "with" : "pets"
        }
    ]
}
{
    "_id" : ObjectID("5a3903a32cdc59fad5fdc099"),
    "name" : "Bart",
    "hobbies" : [
        {
            "title" : "hitting",
            "with" : "pets"
        },
        {
            "title" : "beating",
            "with" : "pets"
        },
        {
            "title" : "eating",
            "with" : "pets"
        }
    ]
}

我需要用 legos 之类的新值替换所有 with 键的 pets 值。

MongoDB 3.6 版的 documentation 声明如下:

$[] 运算符可用于遍历多个数组和嵌套数组的查询。

由于每个 with 键都位于两个单独的数组中,因此使用 $[] 应该可以完成我需要做的事情。在 Mac 上,它可以完美运行,但在 Windows 机器上,我收到此错误:

cannot use the part (hobbies of hobbies.$[].with) to traverse the element

两台机器都运行 MongoDB shell 版本 3.6.0。 Mac 的操作系统是 macOS Sierra 10.12.6,Windows 机器是 Windows 10。

SO 有许多与位置运算符和我具体遇到的错误有关的问题。但它们都没有解决为什么在相同集合上执行的相同操作在 Windows 上失败但在 Mac 上成功。

我已经尝试了以下两个命令来达到我需要的结果。两者都可以在 Mac 上运行,并且在 Windows 上都失败,并出现上面给出的相同错误。

db.users.updateMany({}, {$set: {"hobbies.$[].with": "legos"}});

db.users.update({}, {$set: {"hobbies.$[].with": "legos"}}, {multi: true});

您可以看到here 的差异的屏幕录像。我提前道歉,Windows机器上的录音中的文字偏小。

非常感谢任何有助于了解如何在 Windows 上解决此问题的帮助。

【问题讨论】:

  • 你能在两个操作系统上运行 db.version() 吗?只是为了确认服务器版本也相同。
  • @Veeram, db.version() 在两台机器上都返回 3.6.0
  • 请确认它是您从不同系统连接到的同一个数据库。该错误表明至少有 1 个文档没有 hobbieshobbies 不是数组。试试db.users.updateMany({hobbies:{$type:"array"}}, {$set: {"hobbies.$[].with": "legos"}});
  • @AlexBlex,感谢您的建议,但 Windows 仍然返回与您建议我尝试的`$type` 运算符相同的错误。是的,数据库是相同的。
  • @AlexBlex,是的,这是正确的——数据库在它们各自的环境中是本地的。它们是分开但相同的。不过,你只是给了我一个想法。我将把数据库上传到 mLab 并将 Windows 和 Mac 指向同一个数据库,看看我是否得到相同的错误。

标签: windows mongodb macos shell mongoose


【解决方案1】:

检查您的功能兼容版本。 默认情况下它可能是 3.4。 Documentation.

您需要将功能兼容版本设置为 3.6

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

【讨论】:

  • 这个有帮助。我首先从只提供 v3.4 的 anaconda 安装 Mongo,然后从官方二进制文件升级到 v3.6。这就是我的原因。
【解决方案2】:

我不知道,但在 Windows 上,您的查询看起来像 () 而不是 {}

【讨论】:

  • 是的,很难看到,因为文字很小,但它们是{ } 而不是( )。不过,感谢您的关注。
【解决方案3】:

Linux 上也存在同样的问题。

我使用的是 Ubuntu 16.04、MongoDB 3.6.1

下面是$[]执行后的输出

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 0 }

P.S:我没有足够的声誉来添加评论,因此在这里发布它

【讨论】:

    【解决方案4】:

    我查看了 mongodb 参考,最低版本是 3.6,其中包含 $[]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-04
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 2012-01-23
      • 2019-12-25
      • 1970-01-01
      相关资源
      最近更新 更多