Meteor中Mongo Aggregate $lookup指定输出字段需求咨询
解决方案:在MongoDB聚合中仅获取关联集合的指定字段
很简单,要实现只获取Stocks集合里的availability数组而非完整文档,你可以通过两种实用的方式调整你的聚合查询:
方法一:在$lookup中使用自定义管道提前过滤字段
这种方式会在关联查询Stocks的时候就只保留需要的字段,减少不必要的数据传输,效率更高:
Products.aggregate([ { $match: cAux }, { $lookup: { from: "Stocks", localField: "sku", foreignField: "sku", as: "availability", // 自定义管道,只保留availability字段,排除其他冗余字段 pipeline: [ { $project: { _id: 0, sku: 0, availability: 1 } } ] } }, // 因为$lookup默认返回数组(即使是一对一关联),先展开数组 { $unwind: "$availability" }, // 将嵌套的availability数组提升到顶层,替换原字段 { $addFields: { availability: "$availability.availability" } }, { $sort: PRODUCT_SORT } ]);
方法二:关联后提取目标字段
如果觉得自定义管道稍复杂,也可以先完成完整的关联,再通过字段操作提取需要的内容:
Products.aggregate([ { $match: cAux }, { $lookup: { from: "Stocks", localField: "sku", foreignField: "sku", as: "availability" } }, // 利用$arrayElemAt取出数组中第一个元素的availability字段(一对一关联下数组仅含一个元素) { $addFields: { availability: { $arrayElemAt: ["$availability.availability", 0] } } }, { $sort: PRODUCT_SORT } ]);
两种方式的区别
- 方法一在关联阶段就过滤了字段,适合数据量较大的场景,能节省内存和带宽
- 方法二更直观易懂,适合快速调整查询的简单场景
两种方案最终都会让你得到期望的结果:{ _id: ..., sku: ..., availability: [] ... }
内容的提问来源于stack exchange,提问作者Miguel Morujão
相关产品推荐
相关产品推荐

