【问题标题】:updating path creates write conflict in mongodb更新路径会在 mongodb 中创建写入冲突
【发布时间】:2020-04-08 19:01:17
【问题描述】:

为什么将 $[] 与 $ 一起使用会导致写入冲突?

db.projectionTesting.updateOne({"metaData.title": "BCDe"} , {$set : {
                                  "metaData.0.title" : "efde" , 
                                   "metaData.$[].hasUpdateddd": 76
}} )
 WriteError({
    "index" : 0,
    "code" : 40,
    "errmsg" : "Updating the path 'metaData.$[].hasUpdateddd' would create a conflict at 'metaData'",
    "op" : {
        "q" : {
            "metaData.title" : "BCDe"
        },
        "u" : {
            "$set" : {
                "metaData.0.title" : "efde",
                "metaData.$[].hasUpdateddd" : 76
            }
        },
        "multi" : false,
        "upsert" : false
    }
}) :

为什么将 $[] 与 $ 一起使用会导致写入冲突?

如果这些都可以正常工作,那么为什么不是上面的那个。我想知道在执行 updateOperation 时使用 $[] 和 $ in 到底有什么问题

 db.projectionTesting.updateOne({"metaData.title": "BCDe"} , 
                                 {$set : {"metaData.0.title" : "efde" , 
                                          "metaData.$.hasUpdateddd": 76}} )
 db.projectionTesting.updateOne({"metaData.title": "BCDe"} , 
                                 {$set : {"metaData.$.title" : "efde" , 
                                           "metaData.$.hasUpdateddd": 76}} )

【问题讨论】:

    标签: arrays mongodb mongo-shell


    【解决方案1】:

    为了保证副本集成员之间的一致性,MongoDB复制要求添加到oplog的操作是幂等的。为实现这种更新操作如$inc$dec,大多数数组操作都以$set的形式存储在oplog中,并带有字段的新值。

    当使用 metaData.$ 组合 2 个更新时,您正在对一个特定元素进行更新。

    当组合 metaData.0metadata.$[] 时,您正在对单个元素和整个数组进行不相关的更新。

    查询执行器没有被赋予逻辑来确保在这种情况下的幂等操作,因此它会因写入冲突而停止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2020-09-11
      • 2011-09-01
      • 2014-05-06
      • 2021-03-09
      • 1970-01-01
      • 2017-11-03
      相关资源
      最近更新 更多