توضیحات
متغیرهای موقت را تعریف کنید که در مراحل بعدی خط لوله قابل ارجاع باشند.
متغیرهایی که در مرحله let(...) ایجاد میشوند، در نتایج نهایی گنجانده نمیشوند، مگر اینکه در مرحله بعدی به صراحت به یک فیلد اختصاص داده شوند (مثلاً با استفاده از add_fields(...) یا select(...) ). این به شما امکان میدهد منطق پیچیده را با شکستن آن به اجزای کوچکتر و قابل استفاده مجدد، بدون بهم ریختن اسناد خروجی، ساده کنید. مرحله let(...) به ویژه برای زیرخط لولههای همبسته مفید است، جایی که یک زیرخط لوله نیاز به ارجاع به مقداری از محدوده سند والد دارد.
مثالها
نود جی اس
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(...) ) در مراحل مختلف قابل دسترسی هستند. مراحلی که چندین سند را "ادغام" میکنند، اجازه استفاده از ارجاعات متغیر را پس از آن نمیدهند، زیرا با ادغام نتایج مرحله قبل با هم، دیگر یک مقدار برای متغیر وجود ندارد.
انجام دهید : پس از فیلتر کردن فیلدهای سند، به یک متغیر ارجاع دهید.
نود جی اس
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();
نباید : بعد از تجمیع، به یک متغیر ارجاع دهید.
نود جی اس
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(...) تعریف کنید.
نود جی اس
// 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(...) رفتار میکند، اما به جای اضافه کردن فیلدها به سند، مقادیر را به متغیرها اختصاص میدهد.