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

C# 如何基于传入的filterCriteria动态查询MongoDB的tasks集合

你这种动态多条件查询的场景,直接用MongoDB官方C#驱动自带的FilterDefinitionBuilder来拼接查询条件就可以,比折腾动态LINQ简单很多,适配性也更好。

具体实现步骤

  1. 先定义接收参数的模型,和前端传的filterCriteria结构对应:
public class FilterCriteria
{
    public string Key { get; set; }
    public object Value { get; set; }
    // 操作类型:支持eq/gt/lt/contains/in等,按需扩展
    public string Type { get; set; }
}
  1. 先定义和tasks集合字段对应的实体类,比如命名为TaskEntity,字段类型和Mongo中的类型一一对应,比如_id对应ObjectId类型,active对应bool类型。
  2. 动态拼接查询过滤器的逻辑:
// 提前注入的Mongo集合对象
private readonly IMongoCollection<TaskEntity> _taskCollection;

public async Task<List<TaskEntity>> GetTasksByFilter(List<FilterCriteria> filterCriteria)
{
    var filterBuilder = Builders<TaskEntity>.Filter;
    // 初始化空过滤器,相当于无任何筛选条件
    var filter = filterBuilder.Empty;

    foreach (var criteria in filterCriteria)
    {
        // 可在这里增加Key合法性校验,避免传入不存在的字段导致查询异常
        switch (criteria.Type.ToLower())
        {
            case "eq":
                filter &= filterBuilder.Eq(criteria.Key, BsonValue.Create(criteria.Value));
                break;
            case "ne":
                filter &= filterBuilder.Ne(criteria.Key, BsonValue.Create(criteria.Value));
                break;
            case "gt":
                filter &= filterBuilder.Gt(criteria.Key, BsonValue.Create(criteria.Value));
                break;
            case "lt":
                filter &= filterBuilder.Lt(criteria.Key, BsonValue.Create(criteria.Value));
                break;
            // 其他操作类型按需补充对应方法即可
        }
    }

    // 直接用拼接好的过滤器执行查询
    return await _taskCollection.Find(filter).ToListAsync();
}

注意事项

  • 如果涉及ObjectId、DateTime这类特殊类型的字段查询,需要提前把传入的Value转换成对应类型再生成BsonValue,不然字符串形式的ObjectId会和数据库里的类型不匹配,查询不到结果。
  • 如果一定要用LINQ实现,需要自行拼接动态表达式树,复杂度较高,对于MongoDB查询场景,直接用原生的FilterBuilder是最优解。

内容的提问来源于stack exchange,提问作者vamshiKrishna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:24:04