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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:52:33