了解MongoDB中的WriteConcern C#

时间:2014-10-30 18:43:31

标签: c# .net mongodb mongodb-.net-driver

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

这是我的问题:

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

This answer建议使用连接字符串,但这看起来像一个全局设置,我不想要,因为我将使用的一些写操作更重要"#34 ;而不是其他人,我不想杀死表演。我注意到那里有一个WriteConcern class但文档并没有详细介绍它的使用(它在文档中的MongoDB.Driver命名空间下)。

特别是,如何将其设置为" Journaled"或者"副本已经确认",看到它已经确认了#34;已确认"默认情况下?

对于每个级别,哪些类型的问题可以通过Write Concern检查?

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

2 个答案:

答案 0 :(得分:1)

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

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毫秒。

答案 1 :(得分:1)

对于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