$lookup
정의
$lookup 은 $source
에서 연결 레지스트리의 Atlas 컬렉션으로 메시지 스트림의 왼쪽 외부 조인을 수행합니다.
사용 사례에 따라 $lookup
파이프라인 단계는 다음 세 가지 구문 중 하나를 사용합니다.
자세히 알아보려면 $lookup 구문을 참조하세요.
경고
$lookup
을 사용하여 스트림을 보강하면 스트림 처리 속도가 느려질 수 있습니다.
다음 프로토타입 양식은 사용 가능한 모든 필드를 보여 줍니다.
{ "$lookup": { "from": { "connectionName": "<registered-atlas-connection>", "db": "<registered-database-name>", "coll": "<atlas-collection-name>" }, "localField": "<field-in-source-messages>", "foreignField": "<field-in-from-collection>", "let": { <var_1>: <expression>, <var_2>: <expression>, …, <var_n>: <expression> }, "pipeline": [ <pipeline to run> ], "as": "<output-array-field>" } }
구문
$lookup
단계에서는 다음 필드가 있는 문서를 사용합니다.
필드 | 유형 | 필요성 | 설명 |
---|---|---|---|
FROM | 문서 | 필수 사항 | $source 의 메시지에 결합할 Atlas 데이터베이스의 컬렉션을 지정하는 문서입니다. 연결 레지스트리에서 컬렉션을 지정해야 합니다. 이 문서의 모든 필드에 값을 지정해야 합니다. |
from.connectionName | 문자열 | 필수 사항 | 연결 레지스트리의 연결 이름입니다. |
from.db | 문자열 | 필수 사항 | 참여하려는 컬렉션이 포함된 Atlas 데이터베이스의 이름입니다. |
from.coll | 문자열 | 필수 사항 | 가입하려는 컬렉션의 이름입니다. |
localField | 문자열 | 조건부 | 참여할 이 필드는 다음 구문의 일부입니다. |
foreignField | 문자열 | 조건부 | 조인할 이 필드는 다음 구문의 일부입니다. |
하자 | 문서 | 조건부 | |
파이프라인 | 문서 | 조건부 | 조인된 컬렉션에서 실행할 이 필드는 다음 구문의 일부입니다. |
방식 | 문자열 | 필수 사항 | 입력 문서에 추가할 새 배열 필드의 이름입니다. 새 배열 필드에는 from 컬렉션에서 매칭되는 문서가 포함됩니다. 지정한 이름이 입력 문서에 이미 필드로 존재하는 경우 기존 필드를 덮어씁니다. |
행동
Atlas Stream Processing 버전의 $lookup 은 $source
의 메시지와 지정된 Atlas collection의 문서를 왼쪽 외부 조인을 수행합니다. 이 버전은 표준 MongoDB 데이터베이스에서 사용할 수 있는 $lookup
단계와 유사하게 작동합니다. 그러나 이 버전에서는 연결 레지스트리 의 Atlas 컬렉션을 from
필드의 값으로 지정해야 합니다.
파이프라인에는 중첩된 $lookup
단계가 포함될 수 있습니다. 파이프라인에 중첩된 $lookup
단계를 포함하는 경우, 표준 from
구문을 사용하여 외부 $lookup
단계와 동일한 원격 Atlas 연결에 컬렉션을 지정해야 합니다.
예제
$lookup : { from: {connectionName: "dbsrv1", db: "db1", coll: "coll1"}, …, pipeline: [ …, { $lookup: { from: "coll2", …, } }, …, ] }
파이프라인의 동일한 컬렉션에 $lookup
및 $merge
가 모두 있는 경우 증분 보기를 유지하려고 하면 Atlas Stream Processing 결과가 다를 수 있습니다. Atlas Stream Processing은 여러 소스 메시지를 동시에 처리한 다음 이를 모두 병합합니다. $lookup
와 $merge
모두 사용하는 동일한 ID를 가진 메시지가 여러 개 있는 경우 Atlas Stream Processing에서 아직 구체화되지 않은 결과를 반환할 수 있습니다.
예제
다음 입력 스트림을 고려하세요.
{ _id: 1, count: 2 } { _id: 1, count: 3 }
파이프라인 내부에 다음과 같은 쿼리가 포함되어 있다고 가정해 보겠습니다.
{ ..., pipeline: [ { $lookup on _id == foreignDoc._id from collection A } { $project: { _id: 1, count: $count + $foreignDoc.count } } { $merge: { into collection A } } ] }
증분 보기를 유지하려는 경우 다음과 유사한 결과를 예상할 수 있습니다.
{ _id: 1, count: 5 }
하지만 Atlas Stream Processing은 Atlas Stream Processing이 문서를 처리했는지 여부에 따라 5
또는 3
을 반환할 수 있습니다.
자세한 내용은 $lookup
을 참조하세요.