mongodb 不可能 (?) E11000 重复插入时重复键错误 dup 键 [英] mongodb impossible (?) E11000 duplicate key error dup key when upserting
问题描述
我的理解是,在单个文档上使用 upsert:true 进行更新是一个原子操作,因此这绝不会导致重复键错误,尤其是在主 _id 键上,当集合没有唯一索引字段时:
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
但这出现在 mongod.log 中:
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
这是 db.orders.getIndexes()
的输出:
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "xyz.orders"
},
我们使用 MongoDB 3.0.0 版和 WiredTiger.
We are using MongoDB version 3.0.0 with WiredTiger.
推荐答案
恐怕这是一个持续存在的问题.我遇到了同样的问题,我找到了一张关于这个的 jira 票:
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
可能有两个更新与 upsert:true 一起出现,导致既没有找到文档也没有插入新文档,这些文档在查询谓词的唯一索引违规上发生冲突.
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.
这篇关于mongodb 不可能 (?) E11000 重复插入时重复键错误 dup 键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!