ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • mongodb join
    BigData 2021. 4. 20. 16:20
    728x90
    반응형

    책이나 도서에서는 MongoDB는 조인을 사용하지 않는다고 하고 조인을 사용하기 보다는 Embedded Document로 하여 

    컬렉션 안에 하나의 필드에 조인인 될만한 로우를 입력하는 방식을 사용한다. 

     

    참조사이트 : https://docs.mongodb.com/manual/tutorial/query-embedded-documents/

     

    하지만 만약 두 개의 컬렉션이 따로 있었고 성능을 높이기 위해서 두 컬렉션을 합쳐서 Embedded Document 구조로 만든다면

    어떻게 해야 할까 생각해 보았다.

     

    방법을 찾아 보다가 $lookup 이라는 함수를 사용하여 JOIN과 동일한 효과로 컬렉션을 합칠 수가 있었다.

    일단 예를 들기 위해 컬렉션을 생성하였다.

     db.orders.insert([{ "_id" : 1, "item" : "abc", "price" : 12, "quantity" : 2 },

     { "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1 },

     { "_id" : 3  }]);

     

     db.inventory.insert([{ "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 },

     { "_id" : 2, "sku" : "def", description: "product 2", "instock" : 80 },

     { "_id" : 3, "sku" : "ijk", description: "product 3", "instock" : 60 },

     { "_id" : 4, "sku" : "jkl", description: "product 4", "instock" : 70 },

     { "_id" : 5, "sku": null, description: "Incomplete" },

     { "_id" : 6 }]);

     

    이렇게 orders 컬렉션과 inventory 컬렉션이 있다. 

    orders 컬렉션 내에 inventory 컬렉션을 넣어 Embedded Document 구조로 컬렉션을 만들어 보자

    우선 두 컬렉션을 합쳐서 새로운 컬렉션 하나를 생성한다.

     db.orders.aggregate([

     {

    $lookup:

            {

              from: "inventory",

              localField: "item",

              foreignField: "sku",

              as: "inventory_docs"

            }

       },

       { $out : "coltest1" }

     ])

     

    localField(aggregate앞에 오는 컬렉션명의 필드)와 foreignField(lookup 아래에 쓰이는 컬렉션명의 필드)는 조인할 키값이라고 보면 된다.

    그리고 as는 새로 생성되는 필드명이다.

    이렇게 해서 수행을 하게 되면 $out 함수에 따라 coltest1 컬렉션이 생성되고 출력된 결과가 입력 된다.

    { "_id" : 1, "item" : "abc", "price" : 12, "quantity" : 2, "inventory_docs" : [ { "_id" : 1, "sku" : "abc", "description" : "product 1", "instock" : 120 } ] }

    { "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "inventory_docs" : [ { "_id" : 4, "sku" : "jkl", "description" : "product 4", "instock" : 70 } ] }

    { "_id" : 3, "inventory_docs" : [ { "_id" : 5, "sku" : null, "description" : "Incomplete" }, { "_id" : 6 } ] }

     

    파일을 출력할 때도 mongo 뒤에 eval에는 자바스크립트만 쓰이고 mogoexport에는 일반 쿼리만 쓰이기 때문에

    aggreagte에 대한 결과도 컬렉션으로 옮겼다가 그 컬렉션을 mongoexport로 출력하면 되겠다.

     

    참조사이트 : https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

    728x90
    반응형
Designed by Tistory.