Let

설명

파이프라인의 후속 단계에서 참조할 수 있는 임시 변수를 정의합니다.

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(...) 단계와 유사하게 동작하지만 문서에 필드를 추가하는 대신 변수에 값을 할당합니다.