Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mongodb impossible (?) E11000 duplicate key error dup key when upserting

My understanding is that update with upsert:true on a single document is an atomic operation so this should never result in a duplicate key error, especially not on the primary _id key, when the collection has no unique-ly indexed fields:

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

But this appears in the 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 

Here is the output from db.orders.getIndexes():

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

We are using MongoDB version 3.0.0 with WiredTiger.

like image 496
Jason Avatar asked Mar 27 '15 16:03

Jason


People also ask

What is duplicate key error in MongoDB?

Because of the unique constraint, MongoDB will only permit one document that lacks the indexed field. If there is more than one document without a value for the indexed field or is missing the indexed field, the index build will fail with a duplicate key error.

How do I avoid duplicate errors in MongoDB?

If you ever faced this error all you need to do is to check your model carefully and find out that is there any unique key set true by you and if it is not necessary then simply remove the unique key from the model or otherwise set a unique value if it is necessary to be unique.

What is Upsert false in MongoDB?

Introduction. In MongoDB, upsert is a method that is used to insert and update the value in any operation. In other words, the MongoDB upsert method is a combination of insert and update (insert + update = upsert). By default, the upsert method's value is always false.


1 Answers

I am afraid that this is an ongoing problem. I had the same problem and I found a jira ticket about this:

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

It is possible that two updates come in with upsert:true, resulting in neither finding a document and both inserting new documents which conflict on unique index violations of the query predicate.

The "solution" here is to add a retry code into the client.

like image 115
jcoll Avatar answered Sep 28 '22 10:09

jcoll