Golang操作MongoDB:投影中统计嵌套number数组总长度
问题说明
使用MongoDB时需要统计单个指定文档内所有嵌套number数组的元素总个数,给定示例文档的预期统计结果为8。当前已完成Golang操作MongoDB的FindOne查询基础代码,仅需在FindOneOptions的Projection投影配置项中补充统计逻辑,返回count字段值。
现有代码框架
idForDB := "621101966rf42c24a8f41b87" ctx, cancel := context.WithTimeout(context.Background(), time.Second * 20) defer cancel() options := options.FindOneOptions{ Projection: bson.M{ "test": "$test", "count": bson.M{}, // 此处需要编写count统计逻辑 }, } result := clients.MongoClient.Database("somedb").Collection("somecollection").FindOne(ctx, bson.M{"_id": idForDB}, &options)
待统计文档结构
需要统计所有number字段下的对象总数,示例文档如下:
{ "test":"other", "list":[ { "number":[ {"value": "1"}, {"value": "2"}, {"value": "2"} ] }, { "number":[ {"value": "1"}, {"value": "2"}, {"value": "2"} ] }, { "number":[ {"value": "1"}, {"value": "2"} ] } ] }
上述示例中所有number数组的元素总个数为8,即预期count返回值为8。
实现方案
投影中直接使用MongoDB聚合运算符即可完成统计,核心逻辑分为两步:
- 用
$map遍历list数组,通过$size运算符获取每个元素下number数组的长度 - 用
$sum对所有数组长度求和,得到总元素个数
补全后的Projection代码
将原代码中count对应的空bson.M{}替换为如下逻辑:
"count": bson.M{ "$sum": bson.M{ "$map": bson.M{ "input": "$list", "as": "item", "in": bson.M{"$size": "$$item.number"}, }, }, },
逻辑校验
$map逐个处理list数组中的元素,将当前遍历项暂存为变量item- 对每个
item,$size计算其下number数组的长度,示例中三个数组长度分别为3、3、2 $sum对所有长度累加:3+3+2=8,和预期结果完全匹配
注意:该写法要求MongoDB版本为3.4及以上,
FindOne的投影参数原生兼容该聚合表达式语法,无需额外使用聚合管道。
内容的提问来源于stack exchange,提问作者Markus Bach
相关产品推荐
相关产品推荐

