首页 > 解决方案 > 在 Upsert 操作中来自 MongoDB 的重复键错误

问题描述

我们有一个E11000 Duplicate key error in BatchWriteOperation从 MongoDB 获取的案例。乍一看,这看起来非常奇怪,因为该文档仅使用 upsert 更新。从概念上讲,这实际上不应该允许重复键发生。

我们遇到了这个问题的描述: 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的非索引属性。

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

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

标签: mongodbupsert

解决方案


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

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

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


推荐阅读