Moje zrozumienie polega na tym, że aktualizacja z upsert: true na pojedynczym dokumencie jest operacją atomową, więc to nigdy nie powinno skutkować duplikatem błędu klucza, szczególnie nie w podstawowej _id klucz, gdy zbiór nie ma unikalne-ly indeksowane pola:mongodb impossible (?) E11000 duplikat key error dup key podczas wstawiania
Order.update({ _id: order._id }, query, { upsert: true }, cb) // with mongoose
Ale to pojawia się w 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
Oto wyjściowy db.orders.getIndexes()
:
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "xyz.orders"
},
Używamy wersji MongoDB 3.0.0 z WiredTiger.
Jaka jest wartość 'order.id 'i' query' - czy obie mają tę samą wartość '_id'? – DaveCoast
Tak. Wiersze w dzienniku dotyczą konkretnego wywołania mangusty z parametrem order.id ustawionym na "6353f880-c6a7-4260-809f-98e0af27b9a2". – Jason
Połączenia przychodzą z tego samego połączenia z '{w: 1}', więc prawdopodobnie są one szeregowe i nie współbieżne - w jaki sposób generujesz wartość 'order._id'? Czy jesteś pewien, że nie wywołałeś aktualizacji dwa razy tym samym 'order._id' w tym samym wątku/procesie? – wdberkeley