MongoDB 中的位置 $ 运算符似乎不会更新多个文档
Posted
技术标签:
【中文标题】MongoDB 中的位置 $ 运算符似乎不会更新多个文档【英文标题】:The positional $ operator in MongoDB does not seem to update multiple documents 【发布时间】:2019-08-21 08:56:58 【问题描述】:以下是来自https://docs.mongodb.com/manual/reference/operator/update/positional/#examples的修改示例
db.students.insert([
"_id" : 1, "grades" : [ 85, 80, 80 ] ,
"_id" : 2, "grades" : [ 88, 90, 92 ] ,
"_id" : 3, "grades" : [ 85, 100, 90 ]
])
db.students.updateOne(
_id: 1, grades: 80 ,
$set: "grades.$" : 82
multi: true
)'
我希望multi: true
更新多个符合选择器标准的文档。
事实上,以下似乎也不起作用:
db.students.insert([
"_id" : 1, "grades" : [ 85, 82, 82 ] ,
"_id" : 2, "grades" : [ 88, 90, 92 ] ,
"_id" : 3, "grades" : [ 80, 100, 90 ]
])
db.students.updateOne(
_id: 1, grades: 80 ,
$set: "grades.$" : 82
multi: true
)'
我希望第三个文档更新为"_id" : 3, "grades" : [82, 100, 90]
【问题讨论】:
multi: true
将更新多个文档,但 _id
是唯一的...如果您查询特定的 _id
值,您将最多更新 1 个文档。
【参考方案1】:
您的查询子句是 _id: 1, grades: 80
,但id:1
有grades : [ 85, 82, 82 ]
。第三个文档将不会更新,因为它的 _id:3
与您的查询子句不匹配。
专业提示:在运行 update
之前执行 find
以预览可能更新的内容*。
db.students.find( _id: 1, grades: 80 )
*find
将返回所有匹配项,而 updateOne
将最多更新 1 个文档,但至少您会知道您的查询子句有效。
【讨论】:
谢谢保罗!这就说得通了。在修改multi: true
之前,我应该更了解这个例子。
修补通常是了解示例代码如何工作的最佳方式。我从破坏示例代码中学到了很多东西!以上是关于MongoDB 中的位置 $ 运算符似乎不会更新多个文档的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MongoDB C# 驱动程序版本 2 中使用 $ 位置运算符
如何在 MongoDB C# 驱动程序版本 2 中使用 $ 位置运算符