$lookup
이 페이지의 내용
MongoDB 서버 $lookup 은 동일한 데이터베이스의 비샤드형 컬렉션 한 개를 다른 비샤드형 컬렉션에 왼쪽 외부 조인을 수행합니다. 조회를 사용하면 "조인된" 컬렉션의 문서를 필터링하여 처리할 수 있으므로 유용합니다.
연합 데이터베이스 인스턴스에서는 $lookup
를 사용하여 동일한 데이터베이스 또는 Atlas, Amazon Web Services S3, HTTP 또는 HTTPS 데이터 저장소의 다른 데이터베이스에서 샤딩된 컬렉션과 샤딩되지 않은 컬렉션을 조인할 수 있습니다.
참고
샤드 컬렉션의 경우 $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" }, }, ] )