如何在C#中过滤MongoDB数据时仅比较DateTime的日期部分?
MongoDB 按日期(忽略时间)筛选DateTime?字段的解决方案
你原来的Eq过滤会因为DateTime.Now带时间戳,无法匹配MongoDB中带任意时间的同日期记录,以下是两种可行的修改方案:
方案一:范围查询(推荐,支持索引)
通过构造当天的起始和结束时间范围,用Gte和Lte组合过滤,这种方式能利用DueDate字段的索引,查询效率更高:
// 获取本地时区当天的起始时间(00:00:00) var startOfDay = DateTime.Today; // 获取本地时区当天的结束时间(23:59:59.9999999) var endOfDay = startOfDay.AddDays(1).AddTicks(-1); // 组合范围过滤条件 var dateFilter = Builders<Recommendation>.Filter.And( Builders<Recommendation>.Filter.Gte(x => x.DueDate, startOfDay), Builders<Recommendation>.Filter.Lte(x => x.DueDate, endOfDay) );
时区适配(针对MongoDB存储UTC时间的场景)
如果MongoDB中DueDate存储的是UTC时间(如示例中的2022-12-08T05:00:00.000+00:00),需要把本地日期转换为UTC时间范围,避免时区偏差:
var localStart = DateTime.Today; var utcStart = localStart.ToUniversalTime(); var utcEnd = utcStart.AddDays(1).AddTicks(-1); var dateFilter = Builders<Recommendation>.Filter.And( Builders<Recommendation>.Filter.Gte(x => x.DueDate, utcStart), Builders<Recommendation>.Filter.Lte(x => x.DueDate, utcEnd) );
方案二:直接比较日期部分
通过提取DueDate的Date属性进行匹配,这种写法更简洁,但如果数据量较大,可能无法利用索引,查询效率较低:
var dateFilter = Builders<Recommendation>.Filter.Where(x => x.DueDate.HasValue && x.DueDate.Value.Date == DateTime.Today );
内容的提问来源于stack exchange,提问作者Vipul Prakash
相关产品推荐
相关产品推荐

