如何将MongoDB $lookup返回的子文档数组转换为ObjectId数组?
在MongoDB中将$lookup返回的子文档数组转为仅含ObjectId的数组
有两种常用方式可以实现需求,可根据聚合流程选择:
方法1:$lookup后用$map转换数组元素
若已完成$lookup操作,后续可通过$project或$addFields阶段,结合$map操作符提取每个子文档的_id字段:
示例聚合管道
db.orders.aggregate([ { $lookup: { from: "products", localField: "productIds", foreignField: "_id", as: "matchedProducts" } }, { $addFields: { productIdsOnly: { $map: { input: "$matchedProducts", as: "item", in: "$$item._id" } } } }, // 可选:剔除不需要的原字段 { $project: { matchedProducts: 0 } } ])
方法2:在$lookup阶段直接返回_id数组(更高效)
如果不需要子文档的其他字段,可在$lookup的内部pipeline中仅返回_id,让as指定的字段直接成为ObjectId数组,省去后续转换步骤:
示例聚合管道
db.orders.aggregate([ { $lookup: { from: "products", let: { orderProductIds: "$productIds" }, pipeline: [ { $match: { $expr: { $in: ["$_id", "$$orderProductIds"] } } }, { $project: { _id: 1 } } // 只保留_id字段 ], as: "productIdsOnly" } } ])
此时productIdsOnly字段直接是[ObjectId("xxx"), ObjectId("yyy"), ...]的形式,无需额外处理。
补充说明
$map会遍历输入数组的每个元素,按in规则生成新元素,这里直接提取子文档的_id。- 方法2更高效,因为在关联查询阶段就过滤掉了无用字段,减少了数据传输和后续处理开销。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

