I have problem with duplicate key. Long time can`t find answer. Please help me solve this problem or explain why i get duplicate key error.
Trace: { [MongoEr
An upsert that results in a document insert is not a fully atomic operation. Think of the upsert as performing the following discrete steps:
So steps 2 and 3 are each atomic, but another upsert could occur after step 1 so your code needs to check for the duplicate key error and then retry the upsert if that occurs. At that point you know the document with that _id
exists so it will always succeed.
For example:
var minute = utils.minute();
Monitor.update({ _id: minute }, { $inc: update }, { upsert: true }, function(err) {
if (err) {
if (err.code === 11000) {
// Another upsert occurred during the upsert, try again. You could omit the
// upsert option here if you don't ever delete docs while this is running.
Monitor.update({ _id: minute }, { $inc: update }, { upsert: true },
function(err) {
if (err) {
console.trace(err);
}
});
}
else {
console.trace(err);
}
}
});
See here for the related documentation.
You may still be wondering why this can happen if the insert is atomic, but what that means is that no updates will occur on the inserted document until it is completely written, not that no other insert of a doc with the same _id
can occur.
Also, you don't need to manually create an index on _id
as all MongoDB collections have a unique index on _id
regardless. So you can remove this line:
monitorSchema.index({_id: -1}); // Not needed