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

MongoDB同查询中结合$lookup与$arrayElemAt过滤dept指定值

MongoDB关联筛选问题解决方案

问题原因

你之前添加$match未生效大概率是匹配阶段的位置和字段匹配方式不对:$lookup返回的dept初始是数组类型,未做字段提取前直接匹配字符串会匹配失败。

方案1:在现有代码基础上新增$match阶段

你可以直接在现有聚合管道的$project阶段后新增筛选阶段,此时dept已经被$arrayElemAt处理为字符串类型,直接匹配即可:

db.pracownicy.aggregate([
  {
    $lookup: {
      from: "zespoly",
      localField: "id_zesp",
      foreignField: "id_zesp",
      as: "dept"
    }
  },
  {
    $project: {
      _id: 0,
      "id_zesp": 1,
      "nazwisko": 1,
      "dept": {$arrayElemAt:["$dept.nazwa", 0]}
    }
  },
  // 新增筛选阶段
  {
    $match: {
      dept: "SYSTEMY EKSPERCKIE"
    }
  }
])

方案2:性能优化版(提前筛选减少关联数据)

如果数据量较大,可以先筛选出目标部门再关联,减少不必要的计算:

db.pracownicy.aggregate([
  // 先筛选属于目标部门的员工,减少后续关联的数据量
  {
    $match: {
      id_zesp: 30
    }
  },
  {
    $lookup: {
      from: "zespoly",
      localField: "id_zesp",
      foreignField: "id_zesp",
      as: "dept"
    }
  },
  {
    $project: {
      _id: 0,
      "id_zesp": 1,
      "nazwisko": 1,
      "dept": {$arrayElemAt:["$dept.nazwa", 0]}
    }
  }
])

执行结果

两种方案都会返回你需要的目标数据:

{ "nazwisko" : "SLOWINSKI", "id_zesp" : 30, "dept" : "SYSTEMY EKSPERCKIE" }
{ "nazwisko" : "ZAKRZEWICZ", "id_zesp" : 30, "dept" : "SYSTEMY EKSPERCKIE" }
{ "nazwisko" : "BIALY", "id_zesp" : 30, "dept" : "SYSTEMY EKSPERCKIE" }
{ "nazwisko" : "HAPKE", "id_zesp" : 30, "dept" : "SYSTEMY EKSPERCKIE" }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:36:00