설명
파이프라인의 후속 단계에서 참조할 수 있는 임시 변수를 정의합니다.
let(...) 단계에서 생성된 변수는 후속 단계에서 필드에 명시적으로 할당되지 않는 한 (예: add_fields(...) 또는 select(...) 사용) 최종 결과에 포함되지 않습니다. 이를 통해 출력 문서를 어지럽히지 않고 복잡한 로직을 더 작고 재사용 가능한 구성요소로 나누어 간소화할 수 있습니다. let(...) 단계는 하위 파이프라인이 상위
문서의 범위에서 값을 참조해야 하는 상관관계가 있는
하위 파이프라인에 특히 유용합니다.
예
Node.js
const results = await db.pipeline()
.collection("/awards")
// `let(...)` referred to as `define(...)` in the Web SDK.
.define(rand().as("r"))
.addFields(
switchOn(
lessThan(variable("r"), 0.05), constant("rare"),
lessThan(variable("r"), 0.25), constant("uncommon"),
constant("common")).as("random_score"))
.execute();
행동
변수와 필드
필드 는 문서 내에 저장된 데이터를 나타내는 반면 변수 는 파이프라인 실행 중에만 존재하는 임시 값입니다.
| 필드 | 변수 | |
|---|---|---|
| 목적 | 문서에 필드 액세스 또는 저장 | 파이프라인 실행 중에 임시 값 생성 또는 액세스 |
| SDK 사용 | field("name") |
variable("name") |
| 범위 | 현재 문서에 로컬 | 파이프라인 및 하위 파이프라인에 전역 |
| 정의되지 않은 참조 | absent로 평가 |
런타임 오류 생성 |
범위:
필드는 로컬 문서로 범위가 지정되는 반면 변수는 별도의 범위에서 정의되며 여러 문서를 함께 '병합'하는 단계 (예: aggregate(...) 또는 distinct(...))가 처음 발생할 때까지 단계 전반에서 계속 액세스할 수 있습니다. 여러 문서를 '병합'하는 단계에서는 이전 단계의 결과를 함께 병합하여 변수에 더 이상 하나의 값이 없으므로 변수 참조를 나중에 사용할 수 없습니다.
실행: 문서의 필드를 필터링한 후 변수를 참조합니다.
Node.js
const results = db.pipeline()
.collection("/awards")
.define(min(field("score").abs(), constant(100)).as("normalized_score"))
.select(field("__name__"), field("owner_id"))
// Successfully able to use the variable.
.where(variable("normalized_score").greaterThan(10))
.execute();
실행하지 않음: 집계 후 변수를 참조합니다.
Node.js
const results = db.pipeline()
.collection("/awards")
.define(min(field("score").abs(), constant(100)).as("normalized_score"))
.aggregate({
accumulators: [ field("score").avg().as("avg_score") ],
groups: [ field("owner_id") ]
})
// Attempting to use the variable throws a request validation error.
.where(variable("normalized_score").greaterThan(10))
.execute();
정의되지 않은 참조:
정의되지 않은 필드를 참조하는 것은 괜찮지만 (absent로 평가됨) 정의되지 않은 변수를 참조하려고 하면 요청 유효성 검사 중에 실패합니다. 이러한 의미에서 필드 참조는 런타임에 맵에서 조회를 실행하는 것으로 볼 수 있는 반면 변수 참조는 정적으로 컴파일된 프로그래밍 언어의 변수와 더 유사합니다.
전역 범위 및 하위 쿼리
변수는 중첩된 파이프라인으로 작업할 때 필수적입니다. 하위 파이프라인은 자체 범위에서 실행되며 현재 처리 중인 문서의 필드에만 액세스할 수 있습니다. 하위 쿼리 내에서 '상위' 문서의 값을 사용하려면 먼저 let(...) 단계를 사용하여 변수로 정의해야 합니다.
Node.js
// Fetch reviewers alongside their negative reviews.
const pipeline = db.pipeline()
.collection("/reviewers")
// `let(...)` referred to as `define(...)` in the Web SDK.
.define(field("__name__").as("reviewer_name"))
.select("__name__", array(db.pipeline().collectionGroup("reviews")
.where(field("author").equals(variable("reviewer_name")))
.where(field("rating").lessThan(2))
.select("review", "rating")).as("negative_reviews"))
.execute();
중복 변수
이전 let(...) 단계에서 이미 정의된 이름으로 변수를 정의하면 이전 변수가 덮어쓰여집니다. 이를 사용하여 파이프라인이 진행됨에 따라 임시 상태를 업데이트할 수 있습니다.
하위 파이프라인에서 참조되는 변수는 어휘 범위 지정 규칙 을 따르며 많은 프로그래밍 언어에서 볼 수 있으며 가장 가까운 (상위) 파이프라인에서 정의한 동일한 이름의 변수를 참조합니다.
add_fields(...)와 비교
let(...) 단계는
add_fields(...) 단계와 유사하게 동작하지만 문서에
필드를 추가하는 대신 변수에 값을 할당합니다.