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:1grades : [ 85, 82, 82 ]。第三个文档将不会更新,因为它的 _id:3 与您的查询子句不匹配。

专业提示:在运行 update 之前执行 find 以预览可能更新的内容*。

 db.students.find( _id: 1, grades: 80 )

*find 将返回所有匹配项,而 updateOne 将最多更新 1 个文档,但至少您会知道您的查询子句有效。

【讨论】:

谢谢保罗!这就说得通了。在修改 multi: true 之前,我应该更了解这个例子。 修补通常是了解示例代码如何工作的最佳方式。我从破坏示例代码中学到了很多东西!

以上是关于MongoDB 中的位置 $ 运算符似乎不会更新多个文档的主要内容,如果未能解决你的问题,请参考以下文章

更新 mongodb 中的嵌套数组

如何在 MongoDB C# 驱动程序版本 2 中使用 $ 位置运算符

如何在 MongoDB C# 驱动程序版本 2 中使用 $ 位置运算符

update() 的 find 部分中的 mongodb 位置运算符

Mongodb位置运算符不起作用

使用标准 SQL 从命令行更新 bigquery 会引发太多位置参数