我们有一个案例,我们从 MongoDB 收到 E11000 BatchWriteOperation 中的重复键错误
。
乍一看这看起来非常奇怪,因为该文档仅使用更新插入进行更新。
从概念上讲,这实际上不应该允许出现重复的键。
我们遇到了这个问题的描述: https://jira.mongodb.org/browse/SERVER-14322
我们的Upsert表达式如下(C#)
var l = await _pids.ReplaceOneAsync(x => x.Id == id && x.LockedBy == null, updatedDocument,
new ReplaceOptions
{
IsUpsert = true
}
);
Id
是文档的普通 _id
,LockedBy
是文档的非索引属性。
我们在这里遇到重复键错误的原因是因为更新的查找部分中的谓词由多个 props 组成吗?
我们当然可以对此进行重试。但我们非常想知道为什么会得到这个,上面的哪一条规则适用于我们这种情况?
最佳答案
如果未找到匹配的文档,ReplaceOneAsync 将尝试更新插入文档。
如果具有匹配 _id 的文档已存在,但已锁定,则不会有匹配的文档,因此将尝试更新插入。
此 upsert 将失败(理应如此),因为已经存在具有该 _id 值的文档,并且 _id 上有唯一索引。
关于mongodb - Upsert 操作时 MongoDB 出现重复键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64064511/