mongodb unmöglich (?) E11000 duplicate-key-Fehler dup-Taste, wenn upserting

Mein Verständnis ist, dass update mit einem einfachen Beispiel:: true auf einem einzigen Dokument ist eine Atomare operation, so sollte dies nie Ergebnis in einem doppelten Schlüssel Fehler, vor allem nicht auf dem primären Schlüssel _id, wenn die Sammlung hat keine unique-ly indizierte Felder:

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

Aber das wird in der 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

Hier ist die Ausgabe von db.orders.getIndexes():

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

Verwenden wir MongoDB version 3.0.0 mit WiredTiger.

  • Was ist der Wert von order._id und query - tun Sie beide haben die gleiche _id Wert?
  • Ja. Die Zeilen in der log sind für eine bestimmte Ausführung des Mungo rufen Sie mit der Bestellung._id als "6353f880-c6a7-4260-809f-98e0af27b9a2".
  • Die Anrufe kommen aus der gleichen Verbindung mit {w : 1 }, so ist es wahrscheinlich, Sie waren Seriell und nicht parallel - wie sind Sie mit der Generierung der order._id Wert? Sind Sie sicher, dass Sie nicht rufen Sie das update zweimal mit der gleichen order._id im gleichen thread/Prozess?
  • Das update wurde tatsächlich als zweimal mit der gleichen Reihenfolge._id. Aber ich dachte, das sollte in Ordnung sein mit einem einfachen Beispiel: das erste anlegen sollte, mit, dass _id und das zweite sollte finden, dass _id und zu aktualisieren, richtig?
  • was war das Fazit hier? Ich Stand vor einem ähnlichen Problem heute
  • Vor dem gleichen problem, niemand weiß, warum dies geschehen könnte?
  • Gleiche problem hier auch.. Hast du eine Lösung finden @Jason
  • Meine Lösung war es nur, Griff der Fehlercode E11000. Sorry habe immer noch keine Erklärung, warum der Fehler Auftritt. Vielleicht bitten Sie eine MongoDB-Entwickler.
  • Wir stehen vor dem gleichen Problem auch, mongo 3.2.1.

InformationsquelleAutor Jason | 2015-03-27
Schreibe einen Kommentar