MongoDB聚合查询未返回嵌套user对象问题排查
问题原因及解决方案
我来帮你分析一下问题所在:
你的聚合管道中,投影阶段构建嵌套user对象时使用的简写语法(uid: 1)没有被正确解析,导致user对象没有出现在结果中。另外,你原本的投影也没有包含role字段,这会导致最终的user对象缺少你期望的角色信息。
为什么会这样?
MongoDB的$project阶段中,虽然支持用field: 1的简写形式包含字段,但在嵌套对象中使用这种简写时,偶尔会因为文档结构的变化(比如经过$lookup和$unwind后)出现解析异常,无法正确映射根级别的字段到嵌套对象中。
修复方案
我们只需要修改$project阶段,明确使用字段路径("$uid")来映射根级字段到嵌套的user对象中,同时添加role字段以满足你的期望结果:
const data = db.collection("users"); data.aggregate([ {$match: {uid: res.locals.uid}}, {$lookup: {from: 'roles', localField: 'role', foreignField: 'role', as: 'Roles'}}, {$unwind: '$Roles'}, {$addFields: {"permissions": '$Roles.permissions'}}, {$project: { user: { uid: "$uid", email: "$email", firstname: "$firstname", lastname: "$lastname", role: "$role" // 添加role字段到user对象 }, permissions: 1, _id: 0 }} ]).toArray(function(err, result) { if (err) { console.log(err); } console.log(result); });
另一种更清晰的写法
你也可以在$addFields阶段就直接构建好user对象,这样后续的$project会更简洁:
const data = db.collection("users"); data.aggregate([ {$match: {uid: res.locals.uid}}, {$lookup: {from: 'roles', localField: 'role', foreignField: 'role', as: 'Roles'}}, {$unwind: '$Roles'}, {$addFields: { permissions: '$Roles.permissions', user: { uid: "$uid", email: "$email", firstname: "$firstname", lastname: "$lastname", role: "$role" } }}, {$project: {user: 1, permissions: 1, _id: 0}} ]).toArray(function(err, result) { if (err) { console.log(err); } console.log(result); });
这样修改后,你就能得到期望的嵌套user对象和对应的permissions数组了。
内容的提问来源于stack exchange,提问作者supremesector
相关产品推荐
相关产品推荐

