web-dev-qa-db-ja.com

mongodb不可能(?)E11000重複キーエラーアップサーティング時の重複キー

私の理解では、単一のドキュメントに対するupsert:trueによる更新はアトミック操作であるため、コレクションに一意にインデックス付けされたフィールドがない場合、特にプライマリ_idキーでは、重複キーエラーが発生することはありません。

_Order.update({ _id: order._id }, query, { upsert: true }, cb) // with mongoose
_

しかし、これはmongod.logに表示されます。

_    2015-03-27T09:39:10.349-0400 I WRITE    [conn258236] update xyz.orders 
query: { _id: "6353f880-c6a7-4260-809f-98e0af27b9a2" } update: { $set: { ... 
} keyUpdates:0 writeConflicts:0 **exception: E11000 duplicate key error dup 
key: { : "6353f880-c6a7-4260-809f-98e0af27b9a2" } code:11000** numYields:1 
locks:{} 138ms


    2015-03-27T09:39:10.349-0400 I COMMAND  [conn258236] command xyz.$cmd 
command: update { update: "orders", writeConcern: { w: 1 }, ordered: true, 
updates: [ { q: { _id: "6353f880-c6a7-4260-809f-98e0af27b9a2" }, u: { $set: { 
... } }, multi: false, upsert: true } ] } keyUpdates:0 writeConflicts:0 
numYields:0 reslen:235 locks:{} 139ms
_

db.orders.getIndexes()からの出力は次のとおりです。

_{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "name" : "_id_",
    "ns" : "xyz.orders"
},
_

WiredTigerでMongoDBバージョン3.0.0を使用しています。

25
Jason

これは継続的な問題であると思います。同じ問題が発生し、これに関するjiraチケットを見つけました。

https://jira.mongodb.org/browse/SERVER-14322

Upsert:trueで2つの更新が行われ、ドキュメントが見つからず、クエリ述語の一意のインデックス違反で競合する新しいドキュメントが挿入される可能性があります。

ここでの「解決策」は、クライアントに再試行コードを追加することです。

22
jcoll