Let

Açıklama

Ardından, işlem hattının sonraki aşamalarında referans verilebilecek geçici değişkenler tanımlayın.

let(...) aşamasında oluşturulan değişkenler, sonraki bir aşamada açıkça bir alana atanmadığı sürece (ör. add_fields(...) veya select(...) kullanılarak) nihai sonuçlara dahil edilmez. Bu sayede, karmaşık mantığı çıktı dokümanlarını karıştırmadan daha küçük ve yeniden kullanılabilir bileşenlere ayırarak basitleştirebilirsiniz. let(...) aşaması, özellikle bir alt işlem hattının üst dokümanın kapsamındaki bir değere başvurması gereken ilişkili alt işlem hatları için yararlıdır.

Örnekler

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();

Davranış

Değişkenler ve Alanlar

Alanlar, belgelerde depolanan verileri temsil ederken değişkenler yalnızca ardışık düzenin yürütülmesi sırasında var olan geçici değerlerdir.

Alanlar Değişkenler
Amaç alanlara erişme veya alanları dokümanlarda saklama işlem hattı yürütme sırasında geçici değerler oluşturma veya bunlara erişme
SDK Kullanımı field("name") variable("name")
Kapsam geçerli dokümana özgü ardışık düzene ve alt ardışık düzenlere genel
Tanımlanmamış Referanslar absent olarak değerlendirilir. çalışma zamanı hatası oluşturur

Kapsam:

Alanlar yerel dokümanla sınırlı olsa da değişkenler ayrı bir kapsamda tanımlanır ve birden fazla dokümanı birleştiren bir aşamanın (ör. aggregate(...) veya distinct(...)) ilk oluşumuna kadar aşamalar arasında erişilebilir kalır. Birden fazla dokümanı birleştiren aşamalar, değişken referanslarının daha sonra kullanılmasını engeller. Bunun nedeni, önceki aşamanın sonuçlarını birleştirerek değişken için artık tek bir değer olmamasıdır.

Yapılacaklar: Belgenin alanlarını filtreledikten sonra bir değişkene referans verin.

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();

Yapmayın: Bir toplama işleminden sonra değişkene referans verme.

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();

Tanımlanmamış Referanslar:

Tanımsız bir alana referans vermek sorun olmasa da (ve yalnızca absent olarak değerlendirilse de) tanımsız bir değişkene referans vermeye çalışmak istek doğrulama sırasında başarısız olur. Bu anlamda, alan referansları çalışma zamanında bir haritada arama işlemi gerçekleştiriyormuş gibi düşünülebilirken değişken referansları, statik olarak derlenmiş bir programlama dilindeki değişkenlere daha çok benzer.

Global Kapsam ve Alt Sorgular

Değişkenler, iç içe yerleştirilmiş işlem hatlarıyla çalışırken çok önemlidir. Alt işlem hattı kendi kapsamı içinde yürütülür ve yalnızca şu anda işlediği dokümanların alanlarına erişebilir. Bir alt sorguda "üst" belgedeki bir değeri kullanmak için önce let(...) aşamasını kullanarak bunu değişken olarak tanımlamanız gerekir.

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();

Çakışan Değişkenler

Önceki bir let(...) aşamasında zaten tanımlanmış bir adla değişken tanımlamak, önceki değişkenin üzerine yazar. Bu, ardışık düzen ilerledikçe geçici durumu güncellemek için kullanılabilir.

Alt ardışık düzende referans verilen değişkenler, birçok programlama dilinde bulunan sözcüksel kapsam kurallarına uyar ve en yakın (üst) ardışık düzen tarafından tanımlanan aynı addaki değişkenleri ifade eder.

add_fields(...) ile karşılaştırma

let(...) aşaması, add_fields(...) aşamasına benzer şekilde çalışır ancak belgeye alan eklemek yerine değişkenlere değer atar.