为什么MongoDB的位置运算符($ [])在Windows机器上失败但在Mac上运行?

时间:2017-12-19 23:42:59

标签: windows mongodb macos shell mongoose

我在名为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上解决此问题的帮助。

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

我无法告诉,但在Windows上看起来像是你的查询()而不是{}

答案 2 :(得分:0)

Linux也存在同样的问题。

我正在使用Ubuntu 16.04,MongoDB 3.6.1

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

var colors = ["gray", "red", "green", "blue", "orange", "yellow", "purple", "pink"];
var rotateOffset = 0;

function setColours()
{
  for (var i = 0; i < colors.length; i++) {
    var arcIndex = (i + rotateOffset) % colors.length;
    document.querySelector("#" + colors[i]).style.strokeDashoffset = (arcIndex ) * -35.3;
  }
}

// Set initial colours
setColours();
    

// Button handlers
document.getElementById('left').addEventListener("click", function() {
  rotateOffset += (colors.length - 1);
  setColours();
});

document.getElementById('right').addEventListener("click", function() {
  rotateOffset++
  setColours();
});
P.S:我没有足够的声誉来添加评论,因此在此发布

答案 3 :(得分:-1)

我检查mongodb引用,最小版本是3.6,其中包含$ []。