You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:00:16