代码之家  ›  专栏  ›  技术社区  ›  MauriRamone

和MongoDB中的操作符使用官方的多个过滤器执行查询。网络驱动程序

  •  7
  • MauriRamone  · 技术社区  · 6 年前

    我使用的是MongoDB 3.2,我想使用官方代码从C#进行查询。网 driver (2.6)

    使用Robomongo执行搜索,正确的查询是:

    db.getCollection('collection1').find({ $and: [ { type: "ws128" }, { tsend: { $gte: ISODate("2018-05-11T14:39:33.000Z"), $lt: ISODate("2018-05-11T14:39:40.000Z") } }  ] })
    

    我想找到所有有钥匙的文件 类型=ws128 变量 tsend介于两个日期之间 查询中显示的。

    在C#中,我定义了如下所示的过滤器,但我不知道如何进行查询:

    DateTime datetimestart =  new DateTime(2018, 5, 11, 14, 39, 33);
    DateTime datetimeend =  new DateTime(2018, 5, 11, 14, 39, 40);
    var filter1 = Builders<BsonDocument>.Filter.Eq("type", "ws128");
    var filter2 = Builders<BsonDocument>.Filter.Gte("tsend", datetimeend);
    var filter3 = Builders<BsonDocument>.Filter.Lt("tsend", datetimestart);
    

    使用单个过滤器,搜索不会出现如下所示的问题,但我不知道如何包含这3个过滤器。

    var cursor = collection.Find(filter1).ToCursor();
    

    有人能指导我继续吗? 非常感谢。 当做

    2 回复  |  直到 6 年前
        1
  •  15
  •   ProgrammingLlama Raveena Sarda    6 年前

    您可以简单地执行以下操作:

    collection.Find(filter1 & filter2 & filter3)
    

    或者:

    collection.Find(Builders<BsonDocument>.Filter.And(filter1, filter2, filter3))
    
        2
  •  5
  •   Joe    6 年前

    使用单个(&a);

    DateTime datetimestart =  new DateTime(2018, 5, 11, 14, 39, 33);
    DateTime datetimeend =  new DateTime(2018, 5, 11, 14, 39, 40);
    var filter1 = Builders<BsonDocument>.Filter.Eq("type", "ws128");
    var filter2 = Builders<BsonDocument>.Filter.Gte("tsend", datetimeend);
    var filter3 = Builders<BsonDocument>.Filter.Lt("tsend", datetimestart);
    var andFilter = filter1 & filter2 & filter3;
    
    var cursor = collection.Find(andFilter).ToCursor();
    

    我可能会写一些不同的代码。我发现读写起来更容易:

    DateTime datetimestart =  new DateTime(2018, 5, 11, 14, 39, 33);
    DateTime datetimeend =  new DateTime(2018, 5, 11, 14, 39, 40);
    
    var builder = Builders<BsonDocument>.Filter;
    var filter1 = builder.Eq("type", "ws128");
    var filter2 = builder.Gte("tsend", datetimeend);
    var filter3 = builder.Lt("tsend", datetimestart);
    
    var cursor = collection.Find(filter1 & filter2 & filter3).ToCursor();