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

求助MongoDB跨不同字段关联查询:实现指定SQL逻辑

实现对应SQL逻辑的MongoDB关联查询语句

你可以使用MongoDB的聚合管道$lookup操作实现两个集合的关联查询,对应你给出的SQL逻辑,有两种可行写法:

写法一:从Employee集合出发(推荐印度员工数量更少时使用)

db.Employee.aggregate([
  // 先过滤印度员工,减少后续处理数据量
  { $match: { country: "India" } },
  // 关联Department集合,用员工deptid匹配部门_id
  {
    $lookup: {
      from: "Department",
      localField: "deptid",
      foreignField: "_id",
      as: "department"
    }
  },
  // 展开关联的部门数组(单员工对应单部门,展开后转为单文档)
  { $unwind: "$department" },
  // 过滤部门名称为IT或HR的记录
  { $match: { "department.deptname": { $in: ["IT", "HR"] } } },
  // 只保留需要的字段,排除默认_id
  { $project: { _id: 0, name: 1, deptname: "$department.deptname" } }
])

写法二:从Department集合出发(推荐符合条件的部门数量更少时使用)

db.Department.aggregate([
  // 先过滤IT和HR部门
  { $match: { deptname: { $in: ["IT", "HR"] } } },
  // 关联Employee集合,用部门_id匹配员工deptid
  {
    $lookup: {
      from: "Employee",
      localField: "_id",
      foreignField: "deptid",
      as: "employees"
    }
  },
  // 展开关联的员工数组
  { $unwind: "$employees" },
  // 过滤印度员工
  { $match: { "employees.country": "India" } },
  // 只保留需要的字段
  { $project: { _id: 0, name: "$employees.name", deptname: 1 } }
])

注意事项

  • 确保Employee.deptid和Department._id字段类型完全一致(比如都是ObjectId或字符串),否则关联会匹配不到数据。
  • 优先从数据量更小的集合开始过滤,能提升查询效率。

内容的提问来源于stack exchange,提问作者santu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:57:11