mongodb join

2021. 4. 20. 16:20BigData

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
반응형