MongoDB:如何将$lookup结果添加至投影的approval字段
解决MongoDB $project中合并lookup结果到已有字段的问题
嘿,我来帮你搞定这个问题!你现在的需求是把$lookup得到的username数组里的指定字段,合并到已经投影好的approval对象里,同时保留approval原有的内容对吧?咱们直接上解决方案和思路:
核心思路
你之前尝试的'approval.username' : '$username'无效,是因为在$project阶段直接给approval赋值的话,会覆盖整个approval字段,而不是在已有的对象上新增属性。正确的做法是用$mergeObjects把原有的approval对象和包含处理后username的新对象合并在一起,同时还要先从username数组里提取出你需要的firstname和lastname。
具体聚合代码
这里提供两种可行的写法,你可以根据自己的场景选择:
写法一:直接提取数组中的字段
如果你的username数组里的每个元素都包含firstname和lastname,可以直接通过数组索引提取:
{ $project: { address: 1, approval: { $mergeObjects: [ // 保留原来的approval第一个元素内容 { $arrayElemAt: ["$approval", 0] }, // 新增username字段,提取数组中第一个用户的firstname和lastname { username: { firstname: { $arrayElemAt: ["$username.firstname", 0] }, lastname: { $arrayElemAt: ["$username.lastname", 0] } } } ] } } }
写法二:先取出用户对象再提取字段(更清晰)
如果想让逻辑更直观,可以先用$arrayElemAt取出username数组里的第一个用户对象,再从中提取需要的字段:
{ $project: { address: 1, approval: { $mergeObjects: [ { $arrayElemAt: ["$approval", 0] }, { username: { $let: { vars: { targetUser: { $arrayElemAt: ["$username", 0] } }, in: { firstname: "$$targetUser.firstname", lastname: "$$targetUser.lastname" } } } } ] } } }
效果验证
执行这个聚合阶段后,你就能得到期望的输出:
{ "address": { "addresshere" }, "approval": { "recordToApprove": "1010", "createDT": "2020-07 18T14:29:54+01:00", "username": { "firstname": "First", "lastname": "Last" } } }
内容的提问来源于stack exchange,提问作者tbowden
相关产品推荐
相关产品推荐

