2021. 4. 20. 16:20ㆍBigData
책이나 도서에서는 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/
'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 |