【问题标题】:How to aggregate mongoose deep collection? (Filter Data)如何聚合猫鼬深度收藏? (过滤数据)
【发布时间】:2021-07-18 20:11:27
【问题描述】:

我有一个关于如何聚合 mongoose 深度集合的问题,例如我有 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" 
  }
]

之前谢谢。

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

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

    使用$lookup

    对同一数据库中的未分片集合执行左外连接,以过滤来自“已连接”集合的文档以进行处理。对于每个输入文档,$lookup 阶段添加一个新的数组字段,其元素是“加入”集合中的匹配文档。 $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
        }
      }
    ])
    

    【讨论】:

    • 感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 2020-02-10
    • 2015-12-16
    • 1970-01-01
    • 2019-01-12
    • 2019-12-29
    • 2021-01-18
    • 2016-11-09
    相关资源
    最近更新 更多