如何使用MongoDB官方.NET驱动实现多条件And查询?
解决MongoDB .NET驱动多过滤器组合的问题
嘿,我先帮你揪出代码里的一个小问题:你定义的filter2和filter3把日期参数搞反啦!你的需求是tsend >= datetimestart且tsend < datetimeend,但现在的代码逻辑刚好相反,这会导致查询结果完全不符合预期,得先把这个纠正过来。
接下来咱们说怎么组合多个过滤器,MongoDB .NET驱动提供了两种直观的方式来实现你需要的$and逻辑:
方法一:使用Filter.And()方法
你可以把所有需要组合的过滤器作为参数传给And()方法,它会自动生成对应的$and查询条件,逻辑清晰易懂:
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", datetimestart); var filter3 = Builders<BsonDocument>.Filter.Lt("tsend", datetimeend); // 组合三个过滤器 var combinedFilter = Builders<BsonDocument>.Filter.And(filter1, filter2, filter3); // 执行查询 var cursor = collection.Find(combinedFilter).ToCursor();
方法二:使用&运算符
驱动重载了FilterDefinition的&运算符,你可以直接用它来拼接多个过滤器,写法更简洁:
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", datetimestart); var filter3 = Builders<BsonDocument>.Filter.Lt("tsend", datetimeend); // 用&运算符组合过滤器 var combinedFilter = filter1 & filter2 & filter3; // 执行查询并直接获取文档列表 var documents = collection.Find(combinedFilter).ToList();
另外补充个小技巧:其实MongoDB对多个并列的查询条件默认就是AND逻辑,你也可以把tsend的两个范围条件合并成一个过滤器,让代码更紧凑:
var dateRangeFilter = Builders<BsonDocument>.Filter.Gte("tsend", datetimestart) & Builders<BsonDocument>.Filter.Lt("tsend", datetimeend); var combinedFilter = Builders<BsonDocument>.Filter.Eq("type", "ws128") & dateRangeFilter;
这样写出来的查询逻辑就和你在Robomongo里验证的完全一致啦!
内容的提问来源于stack exchange,提问作者MauriRamone
相关产品推荐
相关产品推荐

