기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
$lookup
Amazon DocumentDB의 $lookup 집계 단계를 사용하면 두 컬렉션 간에 왼쪽 외부 조인을 수행할 수 있습니다. 이 작업을 사용하면 일치하는 필드 값을 기반으로 여러 컬렉션의 데이터를 결합할 수 있습니다. 관련 컬렉션의 데이터를 쿼리 결과에 통합해야 할 때 특히 유용합니다.
파라미터
-
from: 조인을 수행할 컬렉션의 이름입니다. -
localField:와 일치시킬 입력 문서의 필드입니다foreignField. -
foreignField:from컬렉션에 있는 문서의 필드로,와 일치합니다localField. -
as:from컬렉션의 일치하는 문서가 포함된 출력 문서에 추가할 새 필드의 이름입니다. -
pipeline:localField및가 지정된 경우 선택 사항foreignField입니다.from컬렉션에서 실행할 집계 파이프라인입니다. 파이프라인은from컬렉션에서 문서를 반환합니다. 모든 문서를 반환하려면 빈 파이프라인을 지정합니다[]. 파이프라인에는$out또는$merge단계가 포함될 수 없습니다. 조인 조건 및 상관관계가 있는 하위 쿼리(MongoDB Shell) 섹션을 참조하세요. -
let: 선택 사항입니다.pipeline단계에서 사용할 변수를 정의하는 문서입니다. 변수 표현식을 사용하여에 조인된 입력 문서의 필드에 액세스합니다pipeline. 파이프라인 단계의 변수를 참조하려면"$$<variable>"구문을 사용합니다. 조인 조건 및 상관관계가 있는 하위 쿼리(MongoDB Shell) 섹션을 참조하세요.
예제(MongoDB 쉘)
다음 예제에서는 orders 컬렉션의 데이터를 customers 컬렉션에 조인하는 간단한 $lookup 작업을 보여줍니다.
샘플 문서 생성
db.customers.insertMany([ { _id: 1, name: "Alice" }, { _id: 2, name: "Bob" }, { _id: 3, name: "Charlie" } ]); db.orders.insertMany([ { _id: 1, customer_id: 1, total: 50 }, { _id: 2, customer_id: 1, total: 100 }, { _id: 3, customer_id: 2, total: 75 } ]);
쿼리 예제
db.customers.aggregate([ { $lookup: { from: "orders", localField: "_id", foreignField: "customer_id", as: "orders" } } ]);
출력
[
{
_id: 1,
name: 'Alice',
orders: [
{ _id: 2, customer_id: 1, total: 100 },
{ _id: 1, customer_id: 1, total: 50 }
]
},
{ _id: 3, name: 'Charlie', orders: [] },
{
_id: 2,
name: 'Bob',
orders: [ { _id: 3, customer_id: 2, total: 75 } ]
}
]
조인 조건 및 상관관계가 있는 하위 쿼리(MongoDB Shell)
버전 8.0.2에서 새로 추가되었습니다.
Amazon DocumentDB$lookup에서는 단일 등식 일치 외에도 조인된 컬렉션에서 집계 파이프라인을 실행할 수 있습니다. 이는 모든 입력 문서에 대해 동일한 하위 쿼리를 실행하는 상관관계가 없는 하위 쿼리와 각 입력 문서의 필드에서 정의된 변수를 사용하여 해당 문서와 상관관계가 있는 결과를 반환하는 상관관계가 있는 하위 쿼리를 지원합니다.
구문
상관관계가 있는 하위 쿼리를 실행하려면를 사용하여 입력 문서의 필드에서 변수를 정의하고 pipeline 단계에서 let참조합니다.
{ $lookup: { from: <collection to join>, let: { <var_1>: <expression>, ..., <var_n>: <expression> }, pipeline: [ <pipeline to run on the joined collection> ], as: <output array field> } }
파라미터
-
let: 입력 문서의 필드에서 변수를 정의하는 문서입니다. 파이프라인 단계의 변수를 참조하려면"$$<variable>"구문을 사용합니다. 변수는에 중첩된 추가 단계를pipeline포함하여의$lookup단계에서 액세스할 수 있습니다pipeline.$match단계에서는 연$expr산자를 사용하여 변수에 액세스해야 합니다. 상관 관계가 없는 하위 쿼리를 실행let하려면 생략합니다. -
pipeline:from컬렉션에서 실행할 집계 파이프라인입니다. 파이프라인은 입력 문서의 필드에 직접 액세스할 수 없습니다. 로 변수를 정의하고 대신 변수를let참조합니다. 모든 문서를 반환하려면 빈 파이프라인을 지정합니다[].
$match 단계 내의 $expr 연산자에 배치된 $eq, $gt$gte, $lt, 및 $lte 비교 연산자는 조인된 from 컬렉션의 필드를 let 변수 또는 상수와 비교할 때 컬렉션의 인덱스를 사용할 수 있습니다.
샘플 문서 생성
db.customers.insertMany([ { _id: 1, name: "Alice", min_total: 60 }, { _id: 2, name: "Bob", min_total: 50 }, { _id: 3, name: "Charlie", min_total: 20 } ]); db.orders.insertMany([ { _id: 1, customer_id: 1, total: 50 }, { _id: 2, customer_id: 1, total: 100 }, { _id: 3, customer_id: 2, total: 75 } ]);
쿼리 예제
다음 예시에서는 각 고객을 주문과 조인하고 total가 고객의 자체 min_total 값보다 크거나 같은 주문만 유지합니다. 조인 조건과 고객별 필터는 내의 두 참조 let 변수를 모두 필터링합니다$expr.
db.customers.aggregate([ { $lookup: { from: "orders", let: { customer_id: "$_id", min_total: "$min_total" }, pipeline: [ { $match: { $expr: { $and: [ { $eq: [ "$customer_id", "$$customer_id" ] }, { $gte: [ "$total", "$$min_total" ] } ] } } }, { $project: { _id: 0, total: 1 } } ], as: "qualifying_orders" } } ]);
출력
[
{ _id: 1, name: 'Alice', min_total: 60, qualifying_orders: [ { total: 100 } ] },
{ _id: 2, name: 'Bob', min_total: 50, qualifying_orders: [ { total: 75 } ] },
{ _id: 3, name: 'Charlie', min_total: 20, qualifying_orders: [] }
]
각 고객에 대해 하위 쿼리는 해당 고객의 _id 및 min_total 값으로 평가되므로 각 문서는 상관관계가 있는 자체 결과를 수신합니다.
간결한 구문을 사용한 상관관계가 있는 하위 쿼리(MongoDB Shell)
버전 8.0.2에서 새로 추가되었습니다.
Amazon DocumentDB는 간결한 상관관계가 있는 하위 쿼리 구문도 지원합니다.이 구문은 localField 및의 등식 일치를 foreignField와 결합합니다pipeline. 간결한 구문을 사용하면 $match 단계의 $expr 연산자 내에서 등식 일치를 표현할 필요가 없습니다.
구문
{ $lookup: { from: <collection to join>, localField: <field from the input documents>, foreignField: <field from the documents of the "from" collection>, let: { <var_1>: <expression>, ..., <var_n>: <expression> }, pipeline: [ <pipeline to run> ], as: <output array field> } }
쿼리 예제
다음 예제에서는 상관관계가 있는 이전 하위 쿼리 예제와 동일한 결과를 반환합니다. _id와 간의 등식 일치customer_id는 $expr 조건 foreignField 대신 localField 및 로 표현됩니다.
db.customers.aggregate([ { $lookup: { from: "orders", localField: "_id", foreignField: "customer_id", let: { min_total: "$min_total" }, pipeline: [ { $match: { $expr: { $gte: [ "$total", "$$min_total" ] } } }, { $project: { _id: 0, total: 1 } } ], as: "qualifying_orders" } } ]);
출력
[
{ _id: 1, name: 'Alice', min_total: 60, qualifying_orders: [ { total: 100 } ] },
{ _id: 2, name: 'Bob', min_total: 50, qualifying_orders: [ { total: 75 } ] },
{ _id: 3, name: 'Charlie', min_total: 20, qualifying_orders: [] }
]
상관관계가 있는 하위 쿼리에서 지원되는 단계
$lookup 파이프라인에서 let를 사용하는 경우 다음 단계에서 "$$<variable>" 변수를 참조할 수 있습니다.
$match($expr연산자 사용)$project$addFields$set$group$bucket$bucketAuto$sortByCount$lookup(중첩)$graphLookup
$sort, , , , $unset, $skip $limit$count$sample$unwind, 등의 변수 표현식을 평가하지 않는 단계도 파이프라인에서 사용할 수 있지만 변수를 참조할 수는 없습니다.
, let$facet, , , , $redact, 및를와 $replaceRoot $replaceWith $geoNear $setWindowFields $fill $match 함께 사용하는 $lookup 파이프라인에서는 다음 단계가 지원되지 않습니다$text.
제한 사항
-
에는
$out또는$merge단계가 포함될 수pipeline없습니다.
코드 예제
$lookup 명령을 사용하기 위한 코드 예제를 보려면 사용하려는 언어의 탭을 선택합니다.
상관관계가 있는 하위 쿼리 코드 예제
상관관계가 있는 하위 쿼리와 함께 $lookup 스테이지를 사용하기 위한 코드 예제를 보려면( let 및 사용pipeline) 사용하려는 언어의 탭을 선택합니다.