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.
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With