MongoDB聚合$project无法提取$lookup返回数组内字段如何解决
MongoDB $project提取$lookup返回数组指定下标的字段解决方案
你之前的写法失效是因为compname是数组类型,MongoDB默认的点投影语法不会主动取数组第0位元素的字段,需要显式通过数组运算符处理,以下是两种常用实现方案:
方案1:仅在$project阶段处理(推荐,无需新增聚合阶段)
直接使用$arrayElemAt提取数组第0位元素,再读取对应的name字段,适配所有MongoDB 3.2+版本的写法如下:
{ $project: { // 保留原文档_id,不需要可设为0 _id: 1, compName: { $let: { // 先提取compname数组第0位元素存入临时变量 vars: { firstItem: { $arrayElemAt: ["$compname", 0] } }, // 读取临时变量的name字段 in: "$$firstItem.name" } } } }
如果使用MongoDB 5.0+版本,可使用更简洁的$getField写法:
{ $project: { _id: 1, compName: { $getField: { field: "name", input: { $arrayElemAt: ["$compname", 0] } } } } }
方案2:先拆分数组再投影(适合需要处理数组内多个字段的场景)
如果后续还需要提取compname数组内的多个字段,可以在$lookup之后新增$unwind阶段拆分compname数组,之后就可以使用常规的点语法投影:
// 新增$unwind阶段 { $unwind: "$compname" }, // 后续的$project可以直接用点语法提取字段 { $project: { _id: 1, "compname.name": 1, // 还可以直接提取其他字段,比如"compname.certification": 1 } }
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

