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
相关产品推荐
相关产品推荐

