Mongoose聚合查询分组后如何单次请求完成populate关联填充
问题原因
你之前使用$lookup返回空数组的核心原因是:经过$group阶段处理后,输出的聚合文档中不存在名为group的字段,原Product文档的group字段已经被作为分组键存入了输出文档的_id字段中,因此配置localField: "group"自然无法匹配到关联的ProductGroup数据。
另外补充:Mongoose的populate是专门针对普通find查询设计的语法糖,原生MongoDB聚合管道不直接支持该语法,关联查询必须通过$lookup实现。
正确写法
调整$lookup的关联字段即可在单次聚合查询中完成分组+关联填充,完整代码如下:
const products: Array<IProduct> = await ProductModel.aggregate([ { $match: { category: Types.ObjectId(queryCategory.id) } }, { $group: { _id: '$group', products: { $push: { id: '$_id', name: '$name', article: '$article', price: '$price', discount: '$discount', description: '$description' } }, count: { $sum: 1 }, } }, { $lookup: { from: "productGroups", localField: "_id", // 此处改为分组后的_id,对应原Product文档的group字段值 foreignField: "_id", as: "groupInfo" }, }, // 把$lookup返回的数组转为单个对象,每个分组仅对应一个ProductGroup { $addFields: { groupInfo: { $arrayElemAt: ["$groupInfo", 0] } } } ]);
执行后每个结果的groupInfo字段就是填充完成的ProductGroup完整数据,无需二次查询。
内容的提问来源于stack exchange,提问作者user16373392
相关产品推荐
相关产品推荐

