C#中如何用$gte和$lte过滤字符串类型的日期范围?
解决MongoDB字符串日期字段的$gte/$lte过滤问题
错误原因很明确:你把$gte和$lte两个操作符直接放在了同一个$expr对象里,但MongoDB要求每个$expr只能包含一个顶级表达式字段。
正确写法1:用$and组合两个$expr条件
把原来的两个子条件用$and包裹,确保每个$expr只对应一个比较操作:
var filter = new BsonDocument("$and", new BsonArray { new BsonDocument("$expr", new BsonDocument("$gte", new BsonArray { new BsonDocument("$toDate", "$StartDate"), From } ) ), new BsonDocument("$expr", new BsonDocument("$lte", new BsonArray { new BsonDocument("$toDate", "$StartDate"), To } ) ) });
正确写法2:单个$expr内用$and包含两个比较
也可以把两个比较逻辑放到同一个$expr的$and数组里,写法更简洁:
var filter = new BsonDocument("$expr", new BsonDocument("$and", new BsonArray { new BsonDocument("$gte", new BsonArray { new BsonDocument("$toDate", "$StartDate"), From }), new BsonDocument("$lte", new BsonArray { new BsonDocument("$toDate", "$StartDate"), To }) }) );
额外优化提示
如果你的StartDate字符串是标准ISO格式(比如"2022-02-02"),完全可以直接用字符串比较,不用转成Date类型——因为ISO日期字符串的字典序和实际日期顺序一致,这样性能更好:
// 分写两个条件 var filter = new BsonDocument { { "StartDate", new BsonDocument("$gte", "2022-02-02") }, { "StartDate", new BsonDocument("$lte", "2022-02-04") } }; // 合并成单个条件的写法 var filter = new BsonDocument("StartDate", new BsonDocument("$gte", "2022-02-02") .Add("$lte", "2022-02-04") );
内容的提问来源于stack exchange,提问作者Juan Andres solanas
相关产品推荐
相关产品推荐

