조회를 사용하면 데이터베이스의 "조인된" 컬렉션에서 문서를 필터하다 하여 관련 정보를 더 간단하게 처리 할 수 있습니다.
MongoDB 연합 데이터베이스 인스턴스에서는 $lookup 를 사용하여 동일한 데이터베이스 또는 다른 데이터베이스 에서 샤딩된 또는 비샤드 컬렉션 의 왼쪽 외부 조인을 수행할 수 있습니다. Atlas, AWS S3, HTTP 또는 HTTPS의 모든 연합 데이터 저장소에 있는 컬렉션에 $lookup 를 적용 할 수 있습니다.
참고
샤딩된 컬렉션의 경우 $lookup 는 MongoDB 5.1 이상을 실행하는 Atlas 클러스터에서만 사용할 수 있습니다.
구문
$lookup 구문 은 MongoDB 서버 매뉴얼에 설명되어 있습니다.
Data Federation에서 $lookup 의 from 필드에는 다음과 같은 대체 구문이 있습니다. 이를 통해 선택적 데이터베이스 이름과 필수 collection 이름을 포함하는 객체를 지정할 수 있습니다.
{ $lookup: { localField: "<fieldName>", from: <collection-to-join>|{db: <db>, coll: <collection-to-join>}, foreignField: "<fieldName>", as: "<output-array-field>", } }
{ $lookup: { from: <collection to join>|{db: <db>, coll: <collection-to-join>}, let: { <var_1>: <expression>, …, <var_n>: <expression> }, pipeline: [ <pipeline to execute on the collection to join> ], as: <output array field> } }
from 필드 객체
필드 | 유형 | 설명 | 필요성 |
|---|---|---|---|
| 문자열 | 조건부 | |
| 문자열 | 컬렉션 이름입니다. | 필수 사항 |
예시
다음 collection을 포함하는 sourceDB1, sourceDB2 및 sourceDB3 라는 세 개의 데이터베이스가 있다고 가정해 보겠습니다.
db.orders.insertMany([ { "_id" : 1, "item" : "almonds", "price" : 12, "quantity" : 2 }, { "_id" : 2, "item" : "pecans", "price" : 20, "quantity" : 1 }, { "_id" : 3 } ])
db.catalog.insertMany([ { "_id" : 1, "sku" : "almonds", "description": "product 1" }, { "_id" : 2, "sku" : "bread", "description": "product 2" }, { "_id" : 3, "sku" : "cashews", "description": "product 3" }, { "_id" : 4, "sku" : "pecans", "description": "product 4" }, { "_id" : 5, "sku": null, "description": "Incomplete" }, { "_id" : 6 } ])
db.warehouses.insertMany([ { "_id" : 1, "stock_item" : "almonds", "warehouse": "A", "instock" : 120 }, { "_id" : 2, "stock_item" : "pecans", "warehouse": "A", "instock" : 70 }, { "_id" : 3, "stock_item" : "cashews", "warehouse": "B", "instock" : 60 }, { "_id" : 4, "stock_item" : "bread", "warehouse": "B", "instock" : 80 }, { "_id" : 5, "stock_item" : "cookies", "warehouse": "A", "instock" : 80 } ])
다음 예제에서는 $lookup 애그리게이션 단계를 사용하여 한 컬렉션의 문서를 다른 데이터베이스의 컬렉션의 문서와 결합합니다.
기본 예시
sourceDB1.orders 컬렉션에 대한 다음 애그리게이션 작업은 orders 컬렉션의 item 필드와 컬렉션의 sku 필드를 사용하여 orders 컬렉션의 문서를 sourceDB2.catalog 컬렉션의 문서와 조인합니다. catalog 컬렉션:
db.getSiblingDB("sourceDB1").orders.aggregate( { $lookup: { from: { db: "sourceDB2", coll: "catalog" }, localField: "item", foreignField: "sku", as: "inventory_docs" } } )
중첩된 예시
sourceDB1.orders 컬렉션에 대한 다음 애그리게이션 작업은 orders 컬렉션의 item 필드를 사용하여 orders 컬렉션의 문서를 sourceDB2.catalog 컬렉션 및 sourceDB3.warehouses 컬렉션의 문서와 조인합니다. catalog 컬렉션의 sku 필드와 warehouses 컬렉션의 stock_item 및 instock 필드:
db.getSiblingDB("sourceDB1").orders.aggregate( [ { $lookup: { from: db: "sourceDB2", coll: "catalog", let: { "order_sku": "$item" }, pipeline: [ { $match: { $expr: { $eq: ["$sku", "$$order_sku"] } } }, { $lookup: { from: db: "sourceDB3", coll: "warehouses", pipeline: [ { $match: { $expr:{ $eq : ["$stock_item", "$$order_sku"] } } }, { $project : { "instock": 1, "_id": 0} } ], as: "wh" } }, { "$unwind": "$wh" }, { $project : { "description": 1, "instock": "$wh.instock", "_id": 0} } ], as: "inventory" }, }, ] )