如何聚合猫鼬深度收集? (过滤数据)

时间:2021-04-25 05:03:45

标签: mongodb mongoose mongodb-query aggregation-framework

我有一个关于如何聚合猫鼬深度集合的问题,例如我有 3 个集合:

  1. 专业化工作
[
  {
   "id": 122,
   "name": "Administration",  
  },
  {
   "id": 133,
   "name": "IT/Computer"
  }
]
  1. 职位(与专业化集合的关系,一个专业化的职位有多个职位)
[
  {
   "id": 1,
   "name": "Manager",
   "id_specialization": 122
  },
  {
   "id": 2,
   "name": "Front End Developer",
   "id_specialization": 133
  }
]
  1. 工作(与工作职位的关系)
[
  {
   "id": 1,
   "id_job_position": "1",
   "location": "New York" 
  },
  {
   "id": 2,
   "id_job_position": "2",
   "location": "Dallas"
  }
]

我想通过“专业化”进行过滤,如果我选择专业化的“122”ID,那么我想显示职位数据是该专业化的职位。

[
  {
   "id": 1,
   "id_job_position": "1",
   "location": "New York" 
  }
]

之前谢谢。

1 个答案:

答案 0 :(得分:1)

演示 - https://mongoplayground.net/p/1Bn1OUOODrT

使用$lookup

<块引用>

对同一数据库中的未分片集合执行左外部联接,以从“联接”集合中过滤文档以进行处理。对于每个输入文档,$lookup 阶段添加一个新的数组字段,其元素是“joined”集合中的匹配文档。 $lookup 阶段将这些重构的文档传递到下一阶段。

db.jobPosition.aggregate([
  {
    $match: {
      id_specialization: 122
    }
  },
  {
    "$lookup": {
      "from": "job",
      "localField": "id",
      "foreignField": "id_job_position",
      "as": "jobs"
    }
  },
  {
    $project: {
      jobs: 1
    }
  },
  {
    $unwind: "$jobs" //  break into individual documents can skip if only 1 document will come from lookup
  },
  {
    "$replaceRoot": {
      "newRoot": "$jobs"
    }
  },
  {
    $project: { _id: 0 }
  }
])

如果只有 1 个文档来自查找

演示 - https://mongoplayground.net/p/CNevmFlEWWZ

db.jobPosition.aggregate([
  {
    $match: {
      id_specialization: 122
    }
  },
  {
    "$lookup": {
      "from": "job",
      "localField": "id",
      "foreignField": "id_job_position",
      "as": "jobs"
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$first": "$jobs"
      }
    }
  },
  {
    "$project": {
      _id: 0
    }
  }
])
相关问题