2015-03-27 12 views
14

La mia comprensione è che l'aggiornamento con upsert: true su un singolo documento è un'operazione atomica quindi questo non dovrebbe mai provocare un errore chiave duplicato, specialmente non sull'id_id principale chiave, quando la raccolta ha nessun uniche-ly campi indicizzati:impossibile da mongodb (?) E11000 duplicazione errore chiave dup chiave durante l'upserting

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

Ma questo appare nel 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 

Ecco l'output db.orders.getIndexes():

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

Stiamo usando MongoDB versione 3.0.0 con WiredTiger.

+0

Qual è il valore di 'order._id' e' query' - entrambi hanno lo stesso valore '_id'? – DaveCoast

+0

Sì. Le righe nel log sono per una particolare esecuzione della chiamata mangusta con order._id impostato come "6353f880-c6a7-4260-809f-98e0af27b9a2". – Jason

+0

Le chiamate provengono dalla stessa connessione con '{w: 1}', quindi è probabile che fossero seriali e non simultanei - come stai generando il valore 'order._id'? Sei sicuro di non aver chiamato l'aggiornamento due volte con lo stesso 'order._id' nella stessa discussione/processo? – wdberkeley

risposta

11

Ho paura che questo sia un problema in corso. Ho avuto lo stesso problema e ho trovato un biglietto jira su questo:

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

E 'possibile che due aggiornamenti arrivano con upsert: vero, con conseguente né trovare un documento e sia l'inserimento di nuovi documenti conflitto su violazioni di indice univoche del predicato di query.

La "soluzione" consiste nell'aggiungere un nuovo codice nel client.

+6

Hai ancora questo problema con mongo 3.4 ..... – db80

+2

Sì, è un bug super fastidioso, non posso credere che sia ancora lì in 3.4. Fare tentativi sul lato client all'infinito è una brutta soluzione. – user2667976

+0

Hai solo bisogno di riprovare una volta al massimo. E se è necessario il nuovo tentativo (a causa di un conflitto duplicato), ciò comporterà comunque un aggiornamento. – Shashank

Problemi correlati