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.