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 bir alana açıkça atanmadıkları sürece (ör. add_fields(...) veya select(...) kullanılarak) nihai sonuçlara dahil edilmez. Bu, çıkış dokümanlarını karıştırmadan karmaşık mantığı daha küçük ve yeniden kullanılabilir bileşenlere ayırarak basitleştirmenizi sağlar. 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 Ardışık düzen yürütülürken 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 toplamadan 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 yapma olarak görü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ını izler 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.