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

如何在MongoDB中对未知键的文档字段执行求和聚合?

MongoDB动态键Token计数求和方案

完全可以实现,不需要提前知晓count对象里的键名,用MongoDB的聚合管道就能搞定,具体步骤如下:

聚合步骤拆解

  1. 把count对象转成键值对数组
    用$objectToArray操作符将每个文档的count对象转换成[{k: 键名, v: 计数值}]格式的数组,方便后续处理。
{
  $project: {
    countArray: { $objectToArray: "$count" }
  }
}
  1. 展开数组元素
    用$unwind把数组里的每个键值对拆成独立文档,这样每个token的计数都变成单独的一条数据。
{ $unwind: "$countArray" }
  1. 按token键名分组求和
    以token的键名为分组依据,对所有文档中该token的计数值求和。
{
  $group: {
    _id: "$countArray.k",
    total: { $sum: "$countArray.v" }
  }
}
  1. 合并成键值对数组
    把上一步得到的每个token的求和结果重新合并成一个数组,每个元素保持{k: 键名, v: 总计数}的结构。
{
  $group: {
    _id: null,
    countArray: { $push: { k: "$_id", v: "$total" } }
  }
}
  1. 转回目标对象格式
    用$arrayToObject把数组重新转换成count对象,同时去掉多余的_id字段。
{
  $project: {
    _id: 0,
    count: { $arrayToObject: "$countArray" }
  }
}

完整聚合命令

db.collection.aggregate([
  {
    $project: {
      countArray: { $objectToArray: "$count" }
    }
  },
  { $unwind: "$countArray" },
  {
    $group: {
      _id: "$countArray.k",
      total: { $sum: "$countArray.v" }
    }
  },
  {
    $group: {
      _id: null,
      countArray: { $push: { k: "$_id", v: "$total" } }
    }
  },
  {
    $project: {
      _id: 0,
      count: { $arrayToObject: "$countArray" }
    }
  }
])

执行后就能得到你想要的结果:

{
  "count": {
    "a": 5,
    "b": 5,
    "c": 9,
    "d": 6
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:50:20