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

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"},
        },
    },
},

逻辑校验

  1. $map逐个处理list数组中的元素,将当前遍历项暂存为变量item
  2. 对每个item,$size计算其下number数组的长度,示例中三个数组长度分别为3、3、2
  3. $sum对所有长度累加:3+3+2=8,和预期结果完全匹配

注意:该写法要求MongoDB版本为3.4及以上,FindOne的投影参数原生兼容该聚合表达式语法,无需额外使用聚合管道。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:15:31