了解MongoDB C#中的WriteConcern

本文关键字:WriteConcern 中的 MongoDB 了解 | 更新日期: 2023-09-27 18:28:25

我一直在阅读MongoDB中的Write Concern。我知道有几个级别可以确定写入操作成功的保证级别,并且您设置此级别越高,则需要进行性能权衡。但是,我正在 C# 环境中工作,我正在尝试弄清楚如何在那里使用 Write Concern,以及哪些级别最适合某些情况。我已经想出了如何使用 WriteConcernResult 对象收集检查结果,我主要对关卡本身感兴趣。

这些是我的问题:

如何在 C# 中为特定写入设置写入关注级别?

这个答案建议使用连接字符串,但这看起来像一个全局设置,我不想要,因为我将使用的一些写入操作比其他操作更"重要",我不想破坏性能。我注意到有一个WriteConcern类,但文档对它的使用不是很详细(它在文档中的MongoDB.Driver Namespace下(。

特别是,如何将其设置为"已记录"或"副本已确认",因为它默认为"已确认"?

哪些类型的问题可以通过每个级别的写入关注检查?

例如:系统崩溃、电源故障、网络连接问题等。我对一些不容易检测到的东西特别感兴趣,因为电源故障等非常明显,我们可以估计操作可能失败的时间间隔并做出相应的反应。

了解MongoDB C#中的WriteConcern

对于 2.x c# 驱动程序,可以通过以下方式使用写入关注:

var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(new WriteConcern(
        w: 1,
        wTimeout: default(TimeSpan?),
        fsync: true,
        journal: false));

然后,使用此集合对数据库的任何更新都将使用传递的写入关注点。

collection.InsertOne(...);
collection.ReplaceOne(...);
collection.UpdateMany(...);
and so on

有几个预定义的写入问题,例如

对于非常快速但不可靠的更新:

var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(WriteConcern.Unacknowledged);

或类似于默认值的 WriteConcern(w=1(

var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(WriteConcern.W1);

或确认副本集的多数成员

var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(WriteConcern.WMajority);

有关详细信息和更多选项,请参阅此处的文档:https://mongodb.github.io/mongo-csharp-driver/2.7/apidocs/html/T_MongoDB_Driver_WriteConcern.htm

MongoDB C# 驱动程序中的操作具有重载,这些重载接受可以通过使用类构造函数或使用预定义的静态属性获取的WriteConcern

var writeConcern = WriteConcern.W4;
writeConcern.Journal = true;
writeConcern.WTimeout = TimeSpan.FromMilliseconds(100);
new MongoClient().GetServer().GetDatabase("").GetCollection("").Insert(null, null, writeConcern);

例如,这需要在主数据库之上有 3 个副本,因此W4,日志标志被打开,wtimeout 设置为 100 毫秒。