随着MongoDB 3.6 发布 https://docs.mongodb.com/master/release-notes/3.6/#arrayfilters(并且在 MongoDB 3.5.12 的开发分支中可用)您现在可以在单个请求中更新多个数组元素。
这使用了过滤位置$[<identifier>] https://docs.mongodb.com/master/reference/operator/update/positional-filtered/此版本中引入的更新运算符语法:
db.collection.update(
{ "events.profile":10 },
{ "$set": { "events.$[elem].handled": 0 } },
{ "arrayFilters": [{ "elem.profile": 10 }], "multi": true }
)
The "arrayFilters"
传递给选项.update() https://docs.mongodb.com/master/reference/method/db.collection.update/甚至.updateOne() https://docs.mongodb.com/master/reference/method/db.collection.updateOne/, .updateMany() https://docs.mongodb.com/master/reference/method/db.collection.updateMany/, .findOneAndUpdate() https://docs.mongodb.com/master/reference/method/db.collection.findOneAndUpdate/ or .bulkWrite() https://docs.mongodb.com/master/reference/method/db.collection.bulkWrite/方法指定与更新语句中给出的标识符匹配的条件。任何符合给定条件的元素都将被更新。
注意到"multi"
正如问题上下文中给出的那样,预期这将“更新多个元素”,但事实并非如此,而且仍然不是这种情况。这里的用法适用于“多个文件”一如既往的情况或现在以其他方式指定为强制设置.updateMany() https://docs.mongodb.com/master/reference/method/db.collection.updateMany/在现代 API 版本中。
NOTE有点讽刺的是,因为这是在“选项”参数中指定的.update()
与方法一样,语法通常与所有最新发布的驱动程序版本兼容。
然而,事实并非如此mongo
shell,因为该方法在那里实现的方式(“讽刺的是为了向后兼容”)arrayFilters
解析选项的内部方法无法识别和删除参数,以便提供与先前 MongoDB 服务器版本和“遗留”的“向后兼容性”.update()
API 调用语法。
所以如果你想在mongo
shell 或其他“基于 shell”的产品(特别是 Robo 3T),您需要来自开发分支或生产版本的最新版本(3.6 或更高版本)。
也可以看看positional all $[] https://docs.mongodb.com/master/reference/operator/update/positional-all/它还更新“多个数组元素”,但不适用于指定条件并适用于all数组中的元素,其中这是所需的操作。
另请参阅使用 MongoDB 更新嵌套数组 https://stackoverflow.com/a/23577266/2313887了解这些新的位置运算符如何应用于“嵌套”数组结构,其中“数组位于其他数组内”。
重要的- 从以前版本升级的安装“可能”没有启用 MongoDB 功能,这也可能导致语句失败。您应该确保升级过程完整,包含索引升级等详细信息,然后运行
db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } )
或适用于您安装的版本的更高版本。 IE"4.0"
目前适用于版本 4 及更高版本。这启用了新的位置更新运算符等功能。您还可以检查:
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
返回当前设置