美文网首页
Mongodb多表关联查询$lookup

Mongodb多表关联查询$lookup

作者: 梦安web开发 | 来源:发表于2022-04-02 08:26 被阅读0次

    $lookup聚合中常见的操作符,可以对数据库中的未分片集合执行外部集合联接,以过滤“联接”集合中的文档以进行处理。

    单连接条件的相等匹配

    要在集合文档的字段与另一个集合的文档的字段之间执行相等匹配,$lookup具有以下语法:

    {
       $lookup:
         {
           from: <collection to join>,
           localField: <field from the input documents>,
           foreignField: <field from the documents of the "from" collection>,
           as: <output array field>
         }
    }
    

    例子:
    创建包含以下文档的集合orders:

    db.orders.insert([
       { "_id" : 1, "item" : "almonds", "price" : 12, "quantity" : 2 },
       { "_id" : 2, "item" : "pecans", "price" : 20, "quantity" : 1 },
       { "_id" : 3  }
    ])
    

    使用以下文档创建另一个集合inventory:

    db.inventory.insert([
       { "_id" : 1, "sku" : "almonds", description: "product 1", "instock" : 120 },
       { "_id" : 2, "sku" : "bread", description: "product 2", "instock" : 80 },
       { "_id" : 3, "sku" : "cashews", description: "product 3", "instock" : 60 },
       { "_id" : 4, "sku" : "pecans", description: "product 4", "instock" : 70 },
       { "_id" : 5, "sku": null, description: "Incomplete" },
       { "_id" : 6 }
    ])
    

    orders.iteminventory.sku,将ordersinventory集合关联在一起。

    db.orders.aggregate([
       {
         $lookup:
           {
             from: "inventory",
             localField: "item",
             foreignField: "sku",
             as: "inventory_docs"
           }
      }
    ])
    

    该操作返回以下文档:

    {
       "_id" : 1,
       "item" : "almonds",
       "price" : 12,
       "quantity" : 2,
       "inventory_docs" : [
          { "_id" : 1, "sku" : "almonds", "description" : "product 1", "instock" : 120 }
       ]
    }
    {
       "_id" : 2,
       "item" : "pecans",
       "price" : 20,
       "quantity" : 1,
       "inventory_docs" : [
          { "_id" : 4, "sku" : "pecans", "description" : "product 4", "instock" : 70 }
       ]
    }
    {
       "_id" : 3,
       "inventory_docs" : [
          { "_id" : 5, "sku" : null, "description" : "Incomplete" },
          { "_id" : 6 }
       ]
    }
    
    

    联接集合条件和子查询

    为了在两个集合之间执行不相关的子查询,并允许除单个相等匹配之外的其他联接条件,$lookup具有以下语法:

    {
       $lookup:
         {
           from: <collection to join>,
           let: { <var_1>: <expression>, …, <var_n>: <expression> },
           pipeline: [ <pipeline to execute on the collection to join> ],
           as: <output array field>
         }
    }
    

    例子:
    创建包含以下文档的集合orders:

    db.orders.insert([
      { "_id" : 1, "item" : "almonds", "price" : 12, "ordered" : 2 },
      { "_id" : 2, "item" : "pecans", "price" : 20, "ordered" : 1 },
      { "_id" : 3, "item" : "cookies", "price" : 10, "ordered" : 60 }
    ])
    
    

    使用以下文档创建另一个集合warehouses:

    db.warehouses.insert([
      { "_id" : 1, "stock_item" : "almonds", warehouse: "A", "instock" : 120 },
      { "_id" : 2, "stock_item" : "pecans", warehouse: "A", "instock" : 80 },
      { "_id" : 3, "stock_item" : "almonds", warehouse: "B", "instock" : 60 },
      { "_id" : 4, "stock_item" : "cookies", warehouse: "B", "instock" : 40 },
      { "_id" : 5, "stock_item" : "cookies", warehouse: "A", "instock" : 80 }
    ])
    

    将orders集合与warehouse集合类型分类(stock_item),库存数量是否足以满足 Order 数量的要求结合在一起

    db.orders.aggregate([
       {
          $lookup:
             {
               from: "warehouses",
               let: { order_item: "$item", order_qty: "$ordered" },
               pipeline: [
                  { $match:
                     { $expr:
                        { $and:
                           [
                             { $eq: [ "$stock_item",  "$$order_item" ] },
                             { $gte: [ "$instock", "$$order_qty" ] }
                           ]
                        }
                     }
                  },
                  { $project: { stock_item: 0, _id: 0 } }
               ],
               as: "stockdata"
             }
        }
    ])
    
    
    { "_id" : 1, "item" : "almonds", "price" : 12, "ordered" : 2,
       "stockdata" : [ { "warehouse" : "A", "instock" : 120 }, { "warehouse" : "B", "instock" : 60 } ] }
    { "_id" : 2, "item" : "pecans", "price" : 20, "ordered" : 1,
       "stockdata" : [ { "warehouse" : "A", "instock" : 80 } ] }
    { "_id" : 3, "item" : "cookies", "price" : 10, "ordered" : 60,
       "stockdata" : [ { "warehouse" : "A", "instock" : 80 } ] }
    

    相关文章

      网友评论

          本文标题:Mongodb多表关联查询$lookup

          本文链接:https://www.haomeiwen.com/subject/qpwerrtx.html