Node.js中Mongoose关联查询问题:获取同公司用户的请假记录列表
嘿,这个需求我之前做人事系统的时候刚好实现过,给你两种靠谱的实现方式,根据你的场景选就行:
方法一:分步查询+批量匹配(性能友好)
这种方式先拿到目标公司下所有员工的ID,再直接查询这些员工的请假记录,逻辑直观,性能也不错:
// 假设你已经拿到目标公司的ID,比如 companyId async function getCompanyLeaves(companyId) { // 第一步:获取该公司下所有用户的ID const companyUsers = await User.find({ company: companyId }, '_id'); const userIds = companyUsers.map(user => user._id); // 第二步:查询这些用户对应的所有请假记录,同时可以关联用户信息 const leaves = await Leave.find({ employee: { $in: userIds } }) .populate('employee', 'name email') // 只返回需要的用户字段,减少数据量 .sort({ createdAt: -1 }); // 按创建时间倒序,可选 return leaves; }
方法二:聚合管道(适合复杂关联场景)
如果需要更复杂的筛选、分组或者数据转换,用Mongoose的聚合管道会更灵活,直接一次性完成关联和筛选:
async function getCompanyLeavesWithAggregate(companyId) { const leaves = await Leave.aggregate([ // 第一步:关联用户信息 { $lookup: { from: 'users', // 注意这里是集合的实际名称(一般是模型名小写复数) localField: 'employee', foreignField: '_id', as: 'employee' } }, // 把关联的用户数组转成单个对象 { $unwind: '$employee' }, // 第二步:关联公司信息 { $lookup: { from: 'companies', localField: 'employee.company', foreignField: '_id', as: 'company' } }, // 把公司数组转成单个对象 { $unwind: '$company' }, // 第三步:筛选目标公司的记录 { $match: { 'company._id': mongoose.Types.ObjectId(companyId) } }, // 可选:只保留需要的字段 { $project: { _id: 1, // 其他请假字段,比如 startDate, endDate 等 employee: { name: 1, email: 1 }, company: { name: 1 } } }, // 可选:按时间排序 { $sort: { createdAt: -1 } } ]); return leaves; }
补充小提示
如果你用的是Mongoose 6+版本,populate支持更深层级的关联,比如你也可以这么写(不过性能比分步查询稍差):
const leaves = await Leave.find() .populate({ path: 'employee', match: { company: companyId }, select: 'name email', populate: { path: 'company', select: 'name' } }) .where('employee').ne(null); // 过滤掉没有匹配到目标公司用户的请假记录
这种写法更简洁,但如果数据量较大,分步查询的性能会更优。
内容的提问来源于stack exchange,提问作者SAHBANI Med
相关产品推荐
相关产品推荐

