লেট

বর্ণনা

অস্থায়ী ভেরিয়েবল নির্ধারণ করুন, যেগুলো পাইপলাইনের পরবর্তী ধাপগুলোতে ব্যবহার করা যাবে।

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

আচরণ

ভেরিয়েবল বনাম ফিল্ড

ফিল্ডগুলো ডকুমেন্টের মধ্যে সংরক্ষিত ডেটাকে প্রতিনিধিত্ব করে, অন্যদিকে ভ্যারিয়েবল হলো অস্থায়ী মান যা শুধুমাত্র পাইপলাইন কার্যকর থাকাকালীন বিদ্যমান থাকে।

ক্ষেত্র ভেরিয়েবল
উদ্দেশ্য ডকুমেন্টে ফিল্ড অ্যাক্সেস বা সংরক্ষণ করুন পাইপলাইন নির্বাহের সময় অস্থায়ী মান তৈরি বা অ্যাক্সেস করুন
এসডিকে ব্যবহার 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(...) পর্যায়ের মতোই কাজ করে, তবে এটি ডকুমেন্টে ফিল্ড যোগ করার পরিবর্তে ভেরিয়েবলে মান নির্ধারণ করে।