如何从MongoDB $lookup关联返回的列表中提取指定字段值
解决方案
你可以在原$lookup阶段后新增一个$set阶段处理返回的数组字段即可,适配MongoDB 4.4及以上版本的最简写法如下:
db.C1.aggregate([ { $lookup: { from: "C2", localField: "_id", foreignField: "_id", as: "b" } }, { $set: { b: { $first: "$b.b" } } } ])
逻辑说明
$lookup默认返回数组格式的关联结果,哪怕是一对一匹配也会用数组包裹- 表达式
$b.b会提取关联数组中所有文档的b字段,组成新的数值数组,比如你示例中的关联结果[{_id:1, b:500}]经过这个操作后会变成[500] $first操作符会提取数组的第一个元素,最终得到你需要的单值字段
如果你的MongoDB版本低于4.4,不支持$first操作符,可以用$arrayElemAt替代,写法如下:
db.C1.aggregate([ { $lookup: { from: "C2", localField: "_id", foreignField: "_id", as: "b" } }, { $set: { b: { $arrayElemAt: ["$b.b", 0] } } } ])
注意事项
如果存在C1的_id在C2中无匹配的情况,最终返回的b字段值为null,会保留左表的所有文档,符合左连接的默认逻辑。
内容的提问来源于stack exchange,提问作者Jay Shukla
相关产品推荐
相关产品推荐

