我一直在阅读MongoDB中的Write Concern。我知道有几个级别决定了写操作成功的保证级别,并且设置此级别的性能越高,性能权衡越大。但是,我正在C#环境中工作,我正在尝试弄清楚如何在那里使用Write Concern以及哪些级别对某些情况最有效。我已经想出如何使用WriteConcernResult对象收集检查结果,我主要对关卡本身感兴趣。
这是我的问题:
如何在C#中为特定写入设置写入关注级别?
This answer建议使用连接字符串,但这看起来像一个全局设置,我不想要,因为我将使用的一些写操作更重要"#34 ;而不是其他人,我不想杀死表演。我注意到那里有一个WriteConcern class但文档并没有详细介绍它的使用(它在文档中的MongoDB.Driver命名空间下)。
特别是,如何将其设置为" Journaled"或者"副本已经确认",看到它已经确认了#34;已确认"默认情况下?
对于每个级别,哪些类型的问题可以通过Write Concern检查?
例如:系统崩溃,电源故障,网络连接问题等等。我特别感兴趣的是,因为电源故障等非常明显而且不容易被检测到。可以估计操作可能失败的时间间隔并做出相应的反应。
答案 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