mongodb - 在 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
的非索引属性。
我们在这里得到重复键错误的原因是因为更新的查找部分中的谓词由多个道具组成?
我们当然可以重试这个。但是我们很想知道为什么会得到这个,在这种情况下,上述哪些规则适用于我们?
解决方案
如果找不到匹配的文档,ReplaceOneAsync 将尝试更新插入文档。
如果一个与_id匹配的文档已经存在,但被锁定,则不会有匹配的文档,因此将尝试更新插入。
这个 upsert 将失败(因为它应该),因为已经有一个具有该 _id 值的文档,并且 _id 上有一个唯一索引。
推荐阅读
- c# - 如何使用 refit 库实现 Jwt 身份验证并让它在一定时间内缓存不记名令牌?
- hyperledger-explorer - 无法启动 Hyperledger Explorer
- php - phpdesktop-chrome - 不适用于 php 中的标头
- flutter - 溢出一排凸起的按钮
- python - 在 chrome 中切换 iframe 后调用任何内容会导致错误 - Python Selenium (Chrome)
- java - 错误 404:NoTargetForURIException:没有为 uri 配置目标 servlet
- node.js - 核心node.js中express.js“app.use()”的等价物是什么?
- javascript - 遍历 Dom 中的所有链接 - 有没有更优雅的解决方案?
- python - 如何在熊猫中将列移动到下一行
- scala - 对数据框的所有行应用函数