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
相关产品推荐
相关产品推荐

