MongoDB关联查询:每个父类别取10条视频ID合并为单数组
解决方案
可以通过MongoDB聚合管道一次性完成集合关联、分组、取前10个video_id并输出单个数组的需求,无需用forEach循环拆分输出。以下是优化后的查询:
db.vid_v2.aggregate([ // 过滤存在有效parent_category的视频文档 { $match: { parent_category: { $exists: true, $ne: null } } }, // 关联category集合,获取对应的分类名称 { $lookup: { from: "category", // 关联的category集合名称 localField: "parent_category", // video集合中用于关联的字段 foreignField: "_id", // category集合中匹配的主键字段(若分类用其他字段匹配需调整) as: "category_info" } }, // 展开关联返回的分类信息数组(每个视频对应一个分类,展开后取单条数据) { $unwind: "$category_info" }, // 按父分类分组,收集该分类下所有video_id并保留分类名称 { $group: { _id: "$parent_category", category_name: { $first: "$category_info.category_name" }, // 同一分类名称唯一,取第一个即可 video_ids: { $push: "$video_id" } // 收集当前分类下所有视频ID } }, // 对收集到的video_id数组截取前10个 { $addFields: { top_10_video_ids: { $slice: ["$video_ids", 10] }, parent_category: "$_id" // 将_id重命名为parent_category,字段更直观 } }, // 整理输出字段,去掉冗余的_id和完整video_ids数组 { $project: { _id: 0, video_ids: 0 } } ])
关键逻辑说明:
- $lookup:完成video与category集合的关联,根据
parent_category匹配分类主键,拉取对应的category_name。 - $unwind:将$lookup返回的数组型分类信息展开为单条文档,方便后续分组提取分类名称。
- $group:按父分类维度聚合,用
$push收集该分类下所有video_id,用$first固定分类名称(同一分类下名称唯一)。 - $slice:对收集到的video_id数组截取前10个,得到每个分类的top10视频ID。
- 最终输出为单个数组,每个元素包含
parent_category、category_name和top_10_video_ids三个字段,完全匹配需求。
内容的提问来源于stack exchange,提问作者Vinayak Mishra
相关产品推荐
相关产品推荐

