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

如何用MongoDB聚合统计map类型usage下各seats数组的长度?

解决方案

要处理动态键的usage字段并统计每个seats数组的长度,你需要先将对象转换为可遍历的键值对数组,处理后再还原为对象结构。以下是符合需求的聚合查询:

db.seats.aggregate([
  {
    $addFields: {
      usage: {
        $arrayToObject: {
          $map: {
            input: { $objectToArray: "$usage" },
            as: "item",
            in: {
              k: "$$item.k",
              v: { total: { $size: "$$item.v.seats" } }
            }
          }
        }
      }
    }
  }
])

关键步骤说明:

  • $objectToArray: 将usage这个动态键对象转换成[{k: "键名", v: 对应值}]格式的数组,这样就能遍历所有不确定的键名。
  • $map: 遍历转换后的数组,对每个元素做两件事:保留原键名,将值替换为包含total的对象,用$size计算seats数组的长度。
  • $arrayToObject: 把处理后的键值对数组重新转回对象结构,还原成你需要的usage层级。
  • $addFields: 用处理后的新usage字段覆盖原文档中的对应字段。

处理特殊情况(可选)

如果存在子对象没有seats数组或seats不是数组的情况,可以添加判断逻辑返回默认值:

db.seats.aggregate([
  {
    $addFields: {
      usage: {
        $arrayToObject: {
          $map: {
            input: { $objectToArray: "$usage" },
            as: "item",
            in: {
              k: "$$item.k",
              v: {
                total: {
                  $cond: {
                    if: { $isArray: "$$item.v.seats" },
                    then: { $size: "$$item.v.seats" },
                    else: "NA"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])

为什么你的原查询不生效?

聚合表达式不支持usage.*.seats这种通配符语法,无法直接通过通配符遍历动态键。必须先将对象转换为数组,才能对每个动态键对应的内容进行处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:55:17