复合Mongo过滤器与CosmosDB的对比

问题描述 投票:0回答:1

我们使用的是Mongo C#驱动。在本地,我的后端是一个真正的MongoDB,在Azure的生产中 - MS CosmosDB与Mongo接口。

我的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);

如果有人在这段时间里修改了文档,版本也会改变,过滤器就会失效。我会得到 "Command findAndModify failed: E11000 duplicate key error collection: configurations Failed _id or unique key constraint "异常,并且可以运行重试策略等。

现在的问题是,它与Mongo后端完美地工作,但几乎总是带来这个异常,当再次运行CosmosDB时,无论是部署还是从相同的本地环境。同样的调用,肯定只有一个同时调用者。那么为什么会出现这种情况呢?c#驱动是否对CosmosDB有不同的作用?我可以尝试什么或者如何解释这个问题?

注:用普通的过滤器,即只用 builder.Eq(c => c.Id, myId)两种环境的行为都是一样的,而且工作正常。

c# .net mongodb azure azure-cosmosdb
1个回答
0
投票

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

有一个针对初学者的免费层,是永远免费的,而且不需要信用卡,所以可以转一转,看看你是否得到了相同的语义。

© www.soinside.com 2019 - 2024. All rights reserved.