You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:59:06