MongoDB聚合如何保留匹配结果并生成计算字段?
MongoDB聚合:同时保存匹配结果与提取流派集合
你需要在MongoDB聚合流程中,同时保留match阶段的原始匹配结果,并生成一个去重的流派集合字段。以下是针对需求的调整方案:
问题背景
你希望从电影集合中筛选出含指定流派的电影,同时提取这些电影涉及的所有流派,最终输出结构如下:
{ "result": [ ... // 匹配到的完整电影文档 ], "categories": ["Comedy", "Drama", "Romance", ...] }
你的原始代码通过$unwind和$group只保留了流派,但丢失了原始电影数据,需要调整聚合逻辑。
解决方案
use('the_base'); db.movie.aggregate([ // 1. 筛选含Drama流派的电影,取前5条 { "$match": { "genres": "Drama" } }, { "$limit": 5 }, // 2. 收集所有匹配的电影文档,同时汇总所有电影的流派数组 { "$group": { "_id": null, "result": { "$push": "$$ROOT" }, // 保存完整的原始电影文档 "genreArrays": { "$addToSet": "$genres" } // 收集每个电影的流派数组 } }, // 3. 将二维流派数组扁平化为去重的一维数组 { "$project": { "_id": 0, "result": 1, "categories": { "$reduce": { "input": "$genreArrays", "initialValue": [], "in": { "$setUnion": ["$$value", "$$this"] } } } } } ]);
步骤说明
- $match + $limit:和你原逻辑一致,筛选出含目标流派的电影并限制数量。
- $group:
$push: "$$ROOT":用$$ROOT指代当前完整文档,将所有匹配的电影存入result数组,完整保留原始数据。$addToSet: "$genres":收集每个电影的流派数组,避免重复的流派组合(比如两部电影流派完全一致时只存一次)。
- $project:通过
$reduce遍历二维流派数组,结合$setUnion将所有流派合并为一个去重的一维数组,命名为categories,同时移除默认的_id字段。
执行后即可得到包含匹配电影列表和去重流派集合的目标输出。
内容的提问来源于stack exchange,提问作者jhahspu
相关产品推荐
相关产品推荐

