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

MongoDB C#聚合分组:按Age统计数量并修正代码错误

基于BsonDocument的MongoDB聚合查询实现与代码修正

需求说明

给定MongoDB中的文档数据:

{ "Age": 20, "Gender": "Male", "SomeField": "ABC", "SomeParameter": 17.7 } 
{ "Age": 21, "Gender": "Male", "SomeField": "ABC", "SomeParameter": 18.7 } 
{ "Age": 21, "Gender": "Male", "SomeField": "ABC", "SomeParameter": 19.7 } 

需要实现对应SQL查询的功能:

SELECT Age, count(SomeParameter) FROM Table1 WHERE SomeField = 'ABC' GROUP BY Age

期望输出结果:

Age:20, Count:1;Age:21, Count:2

原代码错误分析

原代码的核心问题是在分组阶段误用了$count操作符——$count是MongoDB的独立聚合阶段(用于返回匹配文档的总数),不能作为分组内的累加器使用。要实现按Age分组计数,需使用$sum累加器,传入1来统计每个分组内的文档数量。

修正后的完整代码

IMongoCollection<BsonDocument> collection = GetYourCollectionHere();

// 构建过滤条件:匹配SomeField等于"ABC"的文档
var filter = Builders<BsonDocument>.Filter.Eq("SomeField", "ABC"); 

// 构建分组规则:以Age为分组键,统计每个分组的文档数
var groupBy = new BsonDocument("_id", "$Age")  // 直接用$Age作为分组标识,简化写法
                .Add("Count", new BsonDocument("$sum", 1));  // 使用$sum累加器实现计数

// 执行聚合查询:先过滤再分组
var result = collection
                .Aggregate()
                .Match(filter)
                .Group(groupBy);

// 遍历并格式化输出结果
foreach (var doc in result)
{
    Console.WriteLine($"Age: {doc["_id"]}, Count: {doc["Count"]}");
}

代码说明

  • 过滤阶段:通过Builders<BsonDocument>.Filter.Eq构建精准匹配条件,筛选出SomeField为"ABC"的目标文档。
  • 分组阶段:
    • 以"_id": "$Age"指定分组键,MongoDB聚合分组必须通过_id定义分组规则。
    • $sum:1等价于SQL中的count(),每匹配到一个分组内的文档就累加1,实现计数效果。
  • 输出处理:从聚合返回的BsonDocument中提取_id(即分组的Age值)和Count字段,按期望格式输出。

执行结果

运行代码后会输出:

Age: 20, Count: 1
Age: 21, Count: 2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:52:53