【问题标题】:Composite Mongo filter agains CosmosDB针对 Cosmos DB 的复合 Mongo 过滤器
【发布时间】: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 =&gt; c.Id, myId),两种环境的行为方式相同且工作正常。

【问题讨论】:

    标签: c# .net mongodb azure azure-cosmosdb


    【解决方案1】:

    CosmosDB 不是真正的 MongoDB。它模拟 MongoDB。因此,真正的 MongoDB 和 CosmosDB 之间的语义会有很大差异。如果您想要相同的语义,请运行 MongoDB Atlas,它也在 Azure 云中运行。如果您运行的是相同版本的 MongoDB,则本地运行的 mongod 进程将与 Atlas 云中的 mongod 相同。您可以在构建第一个集群时选择要运行的 MongoDB 版本。

    有一个针对初学者的免费层级,它永远免费并且不需要信用卡,所以试一试,看看你是否获得了相同的语义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-21
      • 2019-06-05
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      相关资源
      最近更新 更多