путь обновления создает конфликт записи в mongodb - PullRequest
0 голосов
/ 08 апреля 2020

Почему использование $ [] с $ вызывает конфликт записи?

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
    }
}) :

Почему использование $ [] с $ вызывает конфликт записи?

если они работают нормально, то почему бы и нет. Я хочу знать, в чем именно проблема с использованием $ [] с $ in при выполнении updateOperation

 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}} )

1 Ответ

0 голосов
/ 09 апреля 2020

Чтобы обеспечить согласованность между членами набора реплик, репликация MongoDB требует, чтобы операции, добавленные в оплог, были идемпотентными. Для этого операции обновления, такие как $inc, $dec и большинство операций с массивами, сохраняются в журнале операций как $set с новым значением поля.

При объединении 2 обновлений с использованием metaData.$ вы делаете обновления для одного указанного c элемента.

При объединении metaData.0 и metadata.$[] вы делаете несвязанные обновления одного элемента и ко всему массиву.

Исполнителю запроса не был предоставлен лог c, чтобы он мог обеспечить идемпотентную операцию в такой ситуации, поэтому он блокируется конфликтом записи.

...