MongoDB按指定字段分组并生成含投影字段的嵌套键值对方法
解决MongoDB按car_id分组并生成指定嵌套结构的需求
针对匹配brand为honda的文档,按car_id分组后生成以car_id为顶级键、文档_id为二级键的嵌套结构需求,以下是两种场景的正确聚合实现方案:
场景一:仅投影accessories字段
聚合管道代码
db.CARS.aggregate([ // 过滤品牌为honda的文档 { $match: { brand: "honda" } }, // 按car_id分组,构造每个文档的_id->accessories映射数组 { $group: { _id: "$car_id", docs: { $push: { k: "$_id", v: { accessories: "$accessories" } } } } }, // 将映射数组转为以文档_id为键的对象 { $addFields: { docs: { $arrayToObject: "$docs" } } }, // 构造car_id对应嵌套对象的键值对 { $project: { _id: 0, carEntry: { k: "$_id", v: "$docs" } } }, // 合并所有carEntry为最终顶级结构 { $group: { _id: null, result: { $push: "$carEntry" } } }, { $replaceRoot: { newRoot: { $arrayToObject: "$result" } } } ])
逻辑说明
$match:先过滤目标文档,减少后续处理的数据量$group:按car_id聚合,同时收集每个文档的_id和仅保留accessories的对象$arrayToObject:把收集到的数组转换为以文档_id为键的嵌套对象- 后续步骤:将每个
car_id对应的嵌套对象转换为顶级键值对,最终合并成需求结构
场景二:保留_id、car_id、brand、accessories字段
聚合管道代码
db.CARS.aggregate([ { $match: { brand: "honda" } }, { $group: { _id: "$car_id", docs: { $push: { k: "$_id", v: { _id: "$_id", car_id: "$car_id", brand: "$brand", accessories: "$accessories" } } } } }, { $addFields: { docs: { $arrayToObject: "$docs" } } }, { $project: { _id: 0, carEntry: { k: "$_id", v: "$docs" } } }, { $group: { _id: null, result: { $push: "$carEntry" } } }, { $replaceRoot: { newRoot: { $arrayToObject: "$result" } } } ])
逻辑说明
核心逻辑和场景一完全一致,仅在$group阶段的v值中包含了需要保留的全部字段,后续结构转换步骤不变,最终生成包含指定全字段的嵌套结构。
内容的提问来源于stack exchange,提问作者Dejavu
相关产品推荐
相关产品推荐

