Node.js操作MongoDB如何使用$lookup关联查询用户所属项目数据
问题解决方案
核心问题定位
- 你在
$project阶段使用$arrayElemAt仅提取了关联到的项目数组的第一个元素,无法获取当前用户名下所有项目 - 不需要手动合并
users和projects两个集合的查询结果,直接返回$lookup聚合的结果即可满足你的数据结构需求
修正后的模型层代码
const usersCollection = require('../db').db().collection("users") const projectsCollection = require('../db').db().collection("projects") Team.prototype.getAllMembers = function(){ return new Promise (async (resolve, reject) => { try{ // 直接使用聚合查询关联两个集合,不需要额外查两个集合再合并 const userWithProjects = await usersCollection.aggregate([ { $lookup: { from: "projects", // 要关联的集合名 localField: "username", // users集合中用于关联的字段 foreignField: "coder", // projects集合中用于关联的字段 as: "projects" // 关联后存放项目数据的字段名 } }, { $project: { // 保留需要的用户字段 username: 1, email: 1, password: 1, // 保留关联到的所有项目的完整字段 projects: { project_name: 1, project_description: 1, deadline: 1, status: 1 } } } ]).toArray() resolve(userWithProjects) }catch(e){ reject(e) } }) }
$lookup 工作原理说明
$lookup是MongoDB的左外连接操作符,会自动遍历当前集合(此处为users)的每一条记录,用localField指定的字段值,去from指定的关联集合(此处为projects)中匹配foreignField字段值相等的所有记录,最后把匹配到的所有记录组装成数组放到as指定的字段中。
控制器层无需修改
你现有的控制器代码可以直接使用修正后返回的userWithProjects数据,结构和你期望的完全一致,直接传递给模板渲染即可。
内容的提问来源于stack exchange,提问作者Michaela
相关产品推荐
相关产品推荐

