【发布时间】:2020-04-22 13:41:39
【问题描述】:
我们正在使用 Mongo C# 驱动程序。在本地,我的后端是一个真正的 MongoDB,并在 Azure 中进行生产 - 带有 Mongo 接口的 MS CosmosDB。
我的 Mongo 文档有一个版本。我阅读了文档,修改了它,增加了版本,编写了它 - 并且想确保没有人在读取和写入之间更改了文档。所以我使用更新过滤器中的版本:
所以我正在这样做:
var builder = Builders<SettingsStorage>.Filter;
var filter = builder.Eq(c => c.Id, myId) & builder.Eq(c => c.Version, versionAsReadBeforeUpdate);
await this.configurations.FindOneAndUpdateAsync(filter, updateDef);
或者这个,只是为了确定:
var filter1 = Builders<SettingsStorage>.Filter.Eq(c => c.Id, myId);
var filter2 = Builders<SettingsStorage>.Filter.Eq(c => c.Version, versionAsReadBeforeUpdate);
var filter = Builders<SettingsStorage>.Filter.And(filter1, filter2);
await this.configurations.FindOneAndUpdateAsync(filter, updateDef);
因此,如果有人在两者之间更改了文档,则版本也会更改并且过滤器会失败。我会得到“命令 findAndModify 失败:E11000 重复键错误收集:配置失败 _id 或唯一键约束”异常,并且能够运行重试策略等。
现在的问题是它与 Mongo 后端完美配合,但在再次运行 CosmosDB 时几乎总是会出现此异常,无论是在部署时还是从相同的本地环境中。这是同一个呼叫,肯定只有一个同时呼叫者。那怎么来? c# 驱动程序对 CosmosDB 的行为是否不同?我可以尝试什么或如何解释?
注意:使用普通过滤器,即 builder.Eq(c => c.Id, myId),两种环境的行为方式相同且工作正常。
【问题讨论】:
标签: c# .net mongodb azure azure-cosmosdb