如何在MongoDB C#驱动中高效统计文档数组长度?
在MongoDB C#驱动中高效获取文档数组长度的方法
你当前的实现会把整个目标文档加载到内存后再取数组长度,当文档体积大或数组元素很多时,这种方式会浪费带宽和内存。用聚合操作确实是更优的方案,下面给出两种C#驱动的实现方式:
方式一:使用LINQ语法(类型安全)
这种写法贴合C#强类型开发习惯,代码可读性高:
public int GetArticlesCount(int id) { var count = collection.Aggregate() // 过滤指定Id的文档,对应聚合$match阶段 .Match(x => x.Id == id) // 投影计算数组长度,对应$project里的$size操作符 .Project(x => x.articles.Count()) // 获取结果,无匹配文档时返回null .FirstOrDefault(); // 处理无匹配情况,返回0或按需调整 return count ?? 0; }
方式二:使用原生聚合管道(与Mongo Shell写法对齐)
如果习惯Mongo Shell的聚合语法,可以直接构造BsonDocument管道:
public int GetArticlesCount(int id) { var pipeline = new BsonDocument[] { // $match阶段:过滤Id匹配的文档 new BsonDocument("$match", new BsonDocument("_id", id)), // $project阶段:用$size计算articles数组长度 new BsonDocument("$project", new BsonDocument("count", new BsonDocument("$size", "$articles"))) }; var result = collection.Aggregate<BsonDocument>(pipeline).FirstOrDefault(); // 解析结果,无匹配时返回0 return result != null ? result["count"].AsInt32 : 0; }
额外容错处理
如果目标文档可能不存在articles字段,或者该字段不是数组,$size会抛出错误。可以在投影阶段加$ifNull做容错(以原生管道为例):
new BsonDocument("$project", new BsonDocument("count", new BsonDocument("$ifNull", new BsonArray { new BsonDocument("$size", "$articles"), 0 // 字段不存在或非数组时返回0 }) ))
内容的提问来源于stack exchange,提问作者Riddsaw
相关产品推荐
相关产品推荐

