MongoDB+;C#

MongoDB+;C#,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,在实际使用MongoDB之前,我正在测试它的性能。我正在尝试查看每秒可以更新多少文档。我正在使用C#(Mono+Ubuntu)MongoDB驱动程序v1.9和MongoDB v2.4.6 我相信MongoDB中最有效的写性能参数之一是写关注点。如中所述,写入关注点的最宽松值将是-1,然后是0,最后是1 搜索后,我发现我可以在连接字符串中嵌入C#中设置写关注点,如下所示: var client = new MongoClient("mongodb://localhost/?w=-1"); Fin

在实际使用MongoDB之前,我正在测试它的性能。我正在尝试查看每秒可以更新多少文档。我正在使用C#(Mono+Ubuntu)MongoDB驱动程序v1.9和MongoDB v2.4.6

我相信MongoDB中最有效的写性能参数之一是
写关注点
。如中所述,写入关注点的最宽松值将是
-1
,然后是
0
,最后是
1

搜索后,我发现我可以在连接字符串中嵌入C#中设置写关注点,如下所示:

var client = new MongoClient("mongodb://localhost/?w=-1");
FindAndModifyArgs args = new FindAndModifyArgs();
args.SortBy = SortBy.Ascending("last_update");
args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
args.Fields = Fields.Include(new string[] { "counter", "_id" });
var m = collection.FindAndModify(args);

Entity ent = m.GetModifiedDocumentAs<Entity>();
var query = Query<Entity>.EQ(e => e.Id, ent.Id);
var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
collection.Update(query, update);
using (server.RequestStart(database)) {
    FindAndModifyArgs args = new FindAndModifyArgs();
    args.SortBy = SortBy.Ascending("last_update");
    args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
    args.Fields = Fields.Include(new string[] { "counter", "_id" });
    var m = collection.FindAndModify(args);

    Entity ent = m.GetModifiedDocumentAs<Entity>();
    var query = Query<Entity>.EQ(e => e.Id, ent.Id);
    var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
    collection.Update(query, update);
}
以下是我在
w
中使用不同值的结果:

  • 当我将
    w
    设置为
    1
    时,可以获得最快的结果
  • 设置
    w=0
    w=1
    慢28倍
  • w=-1
    将导致引发异常,并显示错误消息
    w值必须大于或等于零
    有人对这些结果有什么解释吗?我做错什么了吗

    [更新]

    我认为有必要设定测试程序,也许其中隐藏着什么。下面是:

    我有一个数据库,在一个集合中有1亿个文档。每个文档都是使用mongo shell创建的:

    { "counter" : 0, "last_update" : new Date() }
    
    下面是
    db.collection.stats()的输出

    使用Ubuntu 12.04中的Mono 3.2.1,我编写了一个C#项目,该项目连接到MongoDB,并尝试更新如下文档:

    var client = new MongoClient("mongodb://localhost/?w=-1");
    
    FindAndModifyArgs args = new FindAndModifyArgs();
    args.SortBy = SortBy.Ascending("last_update");
    args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
    args.Fields = Fields.Include(new string[] { "counter", "_id" });
    var m = collection.FindAndModify(args);
    
    Entity ent = m.GetModifiedDocumentAs<Entity>();
    var query = Query<Entity>.EQ(e => e.Id, ent.Id);
    var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
    collection.Update(query, update);
    
    using (server.RequestStart(database)) {
        FindAndModifyArgs args = new FindAndModifyArgs();
        args.SortBy = SortBy.Ascending("last_update");
        args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
        args.Fields = Fields.Include(new string[] { "counter", "_id" });
        var m = collection.FindAndModify(args);
    
        Entity ent = m.GetModifiedDocumentAs<Entity>();
        var query = Query<Entity>.EQ(e => e.Id, ent.Id);
        var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
        collection.Update(query, update);
    }
    
    问题是:有人能解释为什么
    w=0
    w=1
    慢得多,为什么
    w=-1
    不受支持吗

    [更新]

    我也在我的代码中进行了如下测试:

    var client = new MongoClient("mongodb://localhost/?w=-1");
    
    FindAndModifyArgs args = new FindAndModifyArgs();
    args.SortBy = SortBy.Ascending("last_update");
    args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
    args.Fields = Fields.Include(new string[] { "counter", "_id" });
    var m = collection.FindAndModify(args);
    
    Entity ent = m.GetModifiedDocumentAs<Entity>();
    var query = Query<Entity>.EQ(e => e.Id, ent.Id);
    var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
    collection.Update(query, update);
    
    using (server.RequestStart(database)) {
        FindAndModifyArgs args = new FindAndModifyArgs();
        args.SortBy = SortBy.Ascending("last_update");
        args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
        args.Fields = Fields.Include(new string[] { "counter", "_id" });
        var m = collection.FindAndModify(args);
    
        Entity ent = m.GetModifiedDocumentAs<Entity>();
        var query = Query<Entity>.EQ(e => e.Id, ent.Id);
        var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
        collection.Update(query, update);
    }
    
    使用(server.RequestStart(数据库)){
    FindAndModifyArgs args=新的FindAndModifyArgs();
    args.SortBy=SortBy.Ascending(“上次更新”);
    args.Update=Update.Set(e=>e.last\u Update,DateTime.Now);
    args.Fields=Fields.Include(新字符串[]{“counter”,“_id”});
    var m=collection.FindAndModify(args);
    实体ent=m.GetModifiedDocuments();
    var query=query.EQ(e=>e.Id,ent.Id);
    var update=update.Set(e=>e.counter,ent.counter+1);
    收集、更新(查询、更新);
    }
    

    它对任何结果都没有显著影响。

    要解决
    w=-1
    错误,您可能需要直接使用

    您的测试代码可能遇到一致性问题。查看以将查询放在同一个连接上。根据文件:

    例如,当WriteConcern为w=0时,快速连续调用一系列插入,并且您希望在此后立即以一致的方式查询数据(WriteConcern为w=0时,写入可以在服务器上排队,其他连接可能无法立即看到)

    Aphyr介绍了MongoDB写关注点的各种设置对其一致性的影响。它可能会帮助您解决此问题


    最后,您可以在

    中找到您的驱动程序版本最新版本是1.8.2,您应该验证您真正拥有的版本。我不知道是否支持
    w=n
    语法,但由于我发现连接字符串是一种奇怪的反模式,我建议您使用类似
    var collection=db.GetCollection(“Foo”)的东西,WriteConcern.已确认)
    例如,
    WriteConcern
    类允许非常细粒度的控制。最后,对于任何性能度量,请确保连接池是热的,操作数是重要的,并且您使用的是
    Stopwatch
    QueryPerformanceCounter
    ,而不是
    DateTime
    classW我可以在这里找到我的MongoDB C#驱动程序的版本吗?我不到一个月前从github下载了源代码,所以我确信它没有那么旧,但如果我能找到确切的版本号就太好了。谢谢你的帖子,但是
    WriteConcern。未确认的
    不等于
    w=-1
    。未确认的等于
    w=0
    w=-1
    被称为
    错误忽略
    模式,我在
    WriteConcern
    类中找不到该模式。我将研究您的其余建议,并让您知道它们的进展情况。