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

如何基于数组创建带分组的Facet?MongoDB聚合查询求助

MongoDB按categoryName分组统计item数量实现方案

原始MongoDB文档:

{"_id": 12345,"itemDetails": {"item": [{"id": "51","name": "Chips","categoryId": "101","categoryName": "Solid"},{"id": "52","name": "Apple cider","categoryId": "102","categoryName": "Liquid"},{"id": "52","name": "Mango Juice","categoryId": "103","categoryName": "Liquid"}]}}

期望分组统计结果:

{"items": [{"id": "51","count": 1,"key": "Solid"},{"id": "52","count": 2,"key": "Liquid"}]}

错误查询问题分析

你之前的查询存在两个核心问题:

  • 直接对数组字段$itemDetails.item.id执行分组,MongoDB无法直接解析数组内的单个元素进行分组计算;
  • 分组逻辑未关联categoryName作为维度,导致分组规则不符合需求,最终返回异常结果。

正确聚合查询实现

[
  // 展开item数组,将每个数组元素转为独立文档
  { "$unwind": "$itemDetails.item" },
  // 按item的id和categoryName联合分组,统计每组数量
  {
    "$group": {
      "_id": {
        "id": "$itemDetails.item.id",
        "categoryName": "$itemDetails.item.categoryName"
      },
      "count": { "$sum": 1 }
    }
  },
  // 调整输出字段结构,匹配期望格式
  {
    "$project": {
      "_id": 0,
      "id": "$_id.id",
      "count": 1,
      "key": "$_id.categoryName"
    }
  },
  // 将所有统计结果整合到items数组中
  {
    "$group": {
      "_id": null,
      "items": { "$push": "$$ROOT" }
    }
  }
]

步骤说明

  1. $unwind:拆分itemDetails.item数组,把每个数组元素转为独立文档,这是处理数组类型字段分组的必要前提;
  2. 第一次$group:以item.id和categoryName作为联合分组键,用$sum:1统计每组的条目数量;
  3. $project:重命名字段,将分组键中的内容映射为期望的id和key字段,同时移除默认生成的_id;
  4. 第二次$group:把分散的统计结果合并到items数组中,完全匹配期望的输出结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:53:37