-
mongodb joinBigData 2021. 4. 20. 16:20728x90반응형
책이나 도서에서는 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반응형'BigData' 카테고리의 다른 글
Introduction to NoSQL (NoSQL 소개) (0) 2022.05.16 텍스트분석 및 OpenAPI 개발 구조 설명서-0.1 (0) 2021.04.23 [카프카] Pub/Sub 구조와 프로듀서, 컨슈머 (0) 2021.04.20 [카프카] 페이지 캐시(Page Cache) (0) 2021.04.20 KDD (Data Mining, Knowledge-Discovery in Databases) (0) 2021.04.06