MongoDB C#驱动:如何通过聚合实现多字段分组查询
用MongoDB C#驱动实现分组聚合获取最值
刚好做过类似的需求,我来给你一步步讲怎么实现!
首先,我们需要先定义和集合对应的实体类,以及分组后结果的实体类,方便后续数据映射:
// 对应MongoDB集合中的文档结构 public class YourEntity { public int Age { get; set; } public string Gender { get; set; } public string SomeField { get; set; } public double SomeParameter { get; set; } } // 分组后的结果模型,用来接收聚合后的最终数据 public class GroupedResult { public int Age { get; set; } public string Gender { get; set; } public double MinSomeParameter { get; set; } public double MaxSomeParameter { get; set; } }
接下来就是核心的聚合逻辑了,我们会用到MongoDB的Aggregate管道,完美对应你要的SQL分组查询逻辑:
// 先获取目标集合的实例(mongoDatabase是你已初始化的MongoDatabase对象) var collection = mongoDatabase.GetCollection<YourEntity>("your_collection_name"); // 构建并执行聚合管道 var groupedData = await collection.Aggregate() // 第一步:过滤符合条件的文档,对应SQL的WHERE SomeField = 'ABC' .Match(entity => entity.SomeField == "ABC") // 第二步:按Age和Gender的组合分组,同时计算每组的最小/最大值 .Group( // 分组键:用Age和Gender作为组合依据,MongoDB会将这两个字段值都相同的文档归为一组 keySelector => new { keySelector.Age, keySelector.Gender }, // 分组结果映射:提取分组键的属性,计算对应字段的最值 resultSelector => new GroupedResult { Age = resultSelector.Key.Age, Gender = resultSelector.Key.Gender, MinSomeParameter = resultSelector.Min(x => x.SomeParameter), MaxSomeParameter = resultSelector.Max(x => x.SomeParameter) } ) // 将聚合结果转为列表(异步操作,同步场景可改用ToList()) .ToListAsync();
关键细节补充:
Match阶段:优先过滤掉不符合条件的文档,能减少后续分组计算的数据量,提升整体性能- 如果你的MongoDB字段名和实体类属性名不一致(比如集合里是小写的
age),可以用[BsonElement("age")]属性做字段映射,示例:public class YourEntity { [BsonElement("age")] public int Age { get; set; } // 其他字段同理 }
内容的提问来源于stack exchange,提问作者Dima G
相关产品推荐
相关产品推荐

