- 
          
          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