代码之家  ›  专栏  ›  技术社区  ›  Jeff Tian

如何在MongoDB中进行嵌套$lookup搜索?

  •  2
  • Jeff Tian  · 技术社区  · 7 年前

    我有3个系列:

    1. 位置:
    +------------------+----------------------+-----------------------+
    |    position_id   |    company_id        |       position_name   |
    +------------------+----------------------+-----------------------+
    |         1        |        1             |        position 1     |
    +------------------+----------------------+-----------------------+
    |         2        |        2             |        position 2     |
    +------------------+----------------------+-----------------------+
    
    1. 公司:
    +------------------+----------------------+-----------------------+
    |    company_id    |     industry_id      |       company_name    |
    +------------------+----------------------+-----------------------+
    |        1         |          1           |       company 1       |
    +------------------+----------------------+-----------------------+
    |        2         |          2           |       company 2       |
    +-----------------------------------------------------------------+
    
    1. 行业:
    +------------------+----------------------+
    |     industry_id  |       industry_name  |
    +------------------+----------------------+
    |          1       |      industry 1      |
    +------------------+----------------------+
    |          2       |      industry 2      |
    +------------------+----------------------+
    

    [{
      position_id: 1,
      position_name: 'position 1',
      company: {
        company_id: 1,
        company_name: 'company 1',
        industry: {
          industry_id: 1,
          industry_name: 'industry 1',
        }
      }
    }, {
      position_id: 2,
      posiiton_name: 'position 2',
      company: {
        company_id: 2,
        company_name: 'company 2',
        industry: {
          industry_id: 2,
          industry_name: 'industry 2',
        }
      }
    }]
    

    const pipelines = [{
      $lookup: {
        from: 'companies',
        localField: 'company_id',
        foreignField: 'company_id',
        as: 'company',
    
        $lookup: {
          from: 'industries',
          localField: 'industry_id',
          foreignField: 'industry_id',
          as: 'industry'
        }
      }
    }]
    
    return positions.aggregate(pipelines);
    

    但这会带来一些错误。那么,在mongodb搜索中进行嵌套$lookup的正确方法是什么呢?

    提前谢谢!

    1 回复  |  直到 6 年前
        1
  •  13
  •   Ashh    7 年前

    $lookup 3.6 语法允许您联接嵌套表和 $unwind 从输入文档解构数组字段以输出每个元素的文档。像这样的

    position.aggregate([
      { "$lookup": {
        "from": "companies",
        "let": { "companyId": "$company_id" },
        "pipeline": [
          { "$match": { "$expr": { "$eq": [ "$_id", "$$companyId" ] } } },
          { "$lookup": {
            "from": "industries",
            "let": { "industry_id": "$industry_id" },
            "pipeline": [
              { "$match": { "$expr": { "$eq": [ "$_id", "$$industry_id" ] } } }
            ],
            "as": "industry"
          }},
          { "$unwind": "$industry" }
        ],
        "as": "company"
      }},
      { "$unwind": "$company" }
    ])
    

    position.aggregate([
      { "$lookup": {
        "from": "companies",
        "localField": "company_id",
        "foreignField": "_id",
        "as": "companies"
      }},
      { "$unwind": "$companies" },
      { "$lookup": {
        "from": "industries",
        "localField": "companies.industry_id",
        "foreignField": "_id",
        "as": "companies.industry"
      }},
      { "$unwind": "$companies.industry" },
      { "$group": {
        "_id": "$_id",
        "companies": { "$push": "$companies" }
      }}
    ])
    
    推荐文章