C# 如何基于传入的filterCriteria动态查询MongoDB的tasks集合
你这种动态多条件查询的场景,直接用MongoDB官方C#驱动自带的FilterDefinitionBuilder来拼接查询条件就可以,比折腾动态LINQ简单很多,适配性也更好。
具体实现步骤
- 先定义接收参数的模型,和前端传的
filterCriteria结构对应:
public class FilterCriteria { public string Key { get; set; } public object Value { get; set; } // 操作类型:支持eq/gt/lt/contains/in等,按需扩展 public string Type { get; set; } }
- 先定义和tasks集合字段对应的实体类,比如命名为
TaskEntity,字段类型和Mongo中的类型一一对应,比如_id对应ObjectId类型,active对应bool类型。 - 动态拼接查询过滤器的逻辑:
// 提前注入的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
相关产品推荐
相关产品推荐

