mongodb - Upsert 操作时 MongoDB 出现重复键错误

标签 mongodb upsert

我们有一个案例,我们从 MongoDB 收到 E11000 BatchWriteOperation 中的重复键错误。 乍一看这看起来非常奇怪,因为该文档仅使用更新插入进行更新。 从概念上讲,这实际上不应该允许出现重复的键。

我们遇到了这个问题的描述: https://jira.mongodb.org/browse/SERVER-14322

enter image description here

我们的Upsert表达式如下(C#)

var l = await _pids.ReplaceOneAsync(x => x.Id == id && x.LockedBy == null, updatedDocument,
    new ReplaceOptions
    {
        IsUpsert = true
    }
);

Id 是文档的普通 _idLockedBy 是文档的非索引属性。

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

我们当然可以对此进行重试。但我们非常想知道为什么会得到这个,上面的哪一条规则适用于我们这种情况?

最佳答案

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

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

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

关于mongodb - Upsert 操作时 MongoDB 出现重复键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64064511/

相关文章:

java - 具有 1 个集合的 MongoDB SELF JOIN 查询

javascript - 使用 Node.js Express 将 MongoDB 数据传递到 .ejs-Template

mongodb - 虚拟服务器上的 CouchDB

sql - Postgres 触发器函数 ON CONFLICT 更新另一个表

javascript - 蒙戈 : Group and push more than 1 element

java - 我可以使用 MERGE INTO 在 Apache Derby 中模拟 "upsert"吗?

mysql - upsert() 如何在多个键上工作? [ Sequelize ]

sql - PostgreSQL 更新插入 : do nothing if fields don't change

MYSQL - 从一个表更新插入到另一个表

javascript - Model.find() 不是函数