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

MongoDB 3.2中嵌套数组的Unwind与分组统计问题

解决MongoDB嵌套数组分组统计的问题

首先,你遇到的核心问题是没有先展开外层的data数组——你的原始数据里data本身就是一个数组,直接操作data.car时,它仍然是嵌套在data数组元素里的二维数组,这就导致后续的$unwind和分组操作都没能达到预期效果。

一、正确实现model字段分组统计的聚合管道

我们需要先展开外层的data数组,再展开内层的car数组,最后进行分组统计,完整的聚合代码如下:

.aggregate([
  // 第一步:展开外层的data数组,将数组中的每个元素拆分为独立文档
  { $unwind: { path: "$data", preserveNullAndEmptyArrays: true } },
  // 第二步:展开data对象中的car数组,拆分每个car条目
  { $unwind: { path: "$data.car", preserveNullAndEmptyArrays: true } },
  // 第三步:按car的model字段分组,统计出现次数
  { 
    $group: { 
      _id: "$data.car.model", 
      count: { $sum: 1 } 
    } 
  }
])

执行这个管道后,就能得到你期望的结果:

[ { "_id" : "aaa", "count" : 1 }, { "_id" : "bbb", "count" : 1 }, { "_id" : "ccc", "count" : 1 } ]

二、如何得到扁平化后的{car: [...], user: "xxx"}结构

如果你希望先把数据处理成{ "car" : ["aaa", "bbb", "ccc"], "user" : "123" }这种结构,可以用下面的聚合管道:

.aggregate([
  // 先展开外层的data数组,获取单个data对象
  { $unwind: "$data" },
  // 提取car的model数组和user的id字段
  {
    $project: {
      car: "$data.car.model",
      user: "$data.user.id"
    }
  }
])

这个管道的逻辑是:

  • 先通过$unwind把data数组拆分为单个文档,此时data.user.id就从数组嵌套变成了单个字符串
  • 再通过$project提取data.car.model时,MongoDB会自动将数组中每个元素的model字段收集为一个新数组,最终得到你想要的扁平化结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:42:41