【发布时间】: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 个文档没有
hobbies或hobbies不是数组。试试db.users.updateMany({hobbies:{$type:"array"}}, {$set: {"hobbies.$[].with": "legos"}}); -
@AlexBlex,感谢您的建议,但 Windows 仍然返回与您建议我尝试的`$type` 运算符相同的错误。是的,数据库是相同的。
-
@AlexBlex,是的,这是正确的——数据库在它们各自的环境中是本地的。它们是分开但相同的。不过,你只是给了我一个想法。我将把数据库上传到 mLab 并将 Windows 和 Mac 指向同一个数据库,看看我是否得到相同的错误。
标签: windows mongodb macos shell mongoose