更新插入操作中 MongoDB 的重复键错误

Duplicate key error from MongoDB on Upsert operation

我们有一个例子,我们从 MongoDB 得到 E11000 Duplicate key error in 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是文档的正常_idLockedBy是文档的非索引属性。

我们在这里得到重复键错误的原因是因为更新的查找部分中的谓词由多个道具组成?

我们当然可以重试一下。但我们很想知道为什么会出现这种情况,在这种情况下,上述哪些规则适用于我们?

如果找不到匹配的文档,ReplaceOneAsync 将尝试更新插入文档。

如果具有匹配 _id 的文档已经存在,但被锁定,则不会有匹配的文档,因此将尝试更新插入。

此 upsert 将失败(它应该失败),因为已经有一个具有该 _id 值的文档,并且 _id 上有一个唯一索引。