Docs Menu
Docs Home
/
Atlas
/ / /

$lookup

이 페이지의 내용

  • 구문
  • from 필드 객체
  • 예시
  • 기본 예시
  • 중첩된 예시

MongoDB 서버 $lookup 은 동일한 데이터베이스의 비샤드형 컬렉션 한 개를 다른 비샤드형 컬렉션에 왼쪽 외부 조인을 수행합니다. 조회를 사용하면 "조인된" 컬렉션의 문서를 필터링하여 처리할 수 있으므로 유용합니다.

연합 데이터베이스 인스턴스에서는 $lookup 를 사용하여 동일한 데이터베이스 또는 Atlas, Amazon Web Services S3, HTTP 또는 HTTPS 데이터 저장소의 다른 데이터베이스에서 샤딩된 컬렉션과 샤딩되지 않은 컬렉션을 조인할 수 있습니다.

참고

샤드 컬렉션의 경우 $lookup 는 MongoDB 5.1 이상을 실행하는 Atlas 클러스터에서만 사용할 수 있습니다.

$lookup 구문 은 MongoDB 서버 매뉴얼에 설명되어 있습니다.

Data Federation에서 $lookupfrom 필드에는 다음과 같은 대체 구문이 있습니다. 이를 통해 선택적 데이터베이스 이름과 필수 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>
}
}
필드
유형
설명
필요성

db

문자열

데이터베이스 이름입니다.

데이터베이스 이름을 지정하면 Data Federation은 지정된 데이터베이스의 컬렉션에서 데이터를 읽습니다. 명령이 실행 중인 데이터베이스와 다른 데이터베이스 이름을 지정하는 경우 중첩된 모든 $lookup 단계에서도 이 데이터베이스 이름을 지정 해야 합니다 .

$lookup 단계에서 데이터베이스 이름을 지정하지 않으면 해당 단계의 컬렉션은 가장 가까운 상위 $lookup 단계에 지정된 데이터베이스 이름(있는 경우) 또는 명령이 실행 중인 데이터베이스의 이름을 상속합니다.

조건부

coll

문자열

컬렉션 이름입니다.

필수 사항

다음 collection을 포함하는 sourceDB1, sourceDB2sourceDB3 라는 세 개의 데이터베이스가 있다고 가정해 보겠습니다.

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_iteminstock 필드:

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"
},
},
]
)

돌아가기

$collStats