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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:18:35