Let

ब्यौरा

ऐसे अस्थायी वैरिएबल तय करें जिन्हें पाइपलाइन के बाद के चरणों में रेफ़रंस किया जा सकता है.

let(...) स्टेज में बनाए गए वैरिएबल, फ़ाइनल नतीजों में शामिल नहीं किए जाते. ऐसा तब तक होता है, जब तक उन्हें बाद के किसी स्टेज में किसी फ़ील्ड को साफ़ तौर पर असाइन न किया जाए. उदाहरण के लिए, add_fields(...) या select(...) का इस्तेमाल करना. इससे जटिल लॉजिक को आसान बनाया जा सकता है. इसके लिए, लॉजिक को छोटे-छोटे, फिर से इस्तेमाल किए जा सकने वाले कॉम्पोनेंट में बांटा जाता है. इससे आउटपुट दस्तावेज़ों में गड़बड़ी नहीं होती. let(...) स्टेज, खास तौर पर कोरिलेटेड सब-पाइपलाइन के लिए उपयोगी है. इसमें सब-पाइपलाइन को पैरंट दस्तावेज़ के स्कोप से किसी वैल्यू का रेफ़रंस देना होता है.

उदाहरण

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

व्यवहार

वैरिएबल बनाम फ़ील्ड

फ़ील्ड, दस्तावेज़ों में सेव किए गए डेटा को दिखाते हैं. वहीं, वैरिएबल ऐसी अस्थायी वैल्यू होती हैं जो पाइपलाइन के चालू रहने के दौरान ही मौजूद रहती हैं.

फ़ील्ड वैरिएबल
मकसद दस्तावेज़ों में फ़ील्ड ऐक्सेस या सेव करना पाइपलाइन को एक्ज़ीक्यूट करने के दौरान, कुछ समय के लिए वैल्यू जनरेट करना या उन्हें ऐक्सेस करना
एसडीके टूल का इस्तेमाल field("name") variable("name")
दायरा मौजूदा दस्तावेज़ के लिए स्थानीय ग्लोबल से पाइपलाइन और सब-पाइपलाइन तक
अनडिफ़ाइंड रेफ़रंस absent के बराबर होता है रनटाइम से जुड़ी गड़बड़ी जनरेट करता है

स्कोप:

फ़ील्ड, लोकल दस्तावेज़ के स्कोप में होते हैं, जबकि वैरिएबल को अलग स्कोप में तय किया जाता है. ये वैरिएबल, सभी चरणों में तब तक ऐक्सेस किए जा सकते हैं, जब तक कि कोई ऐसा चरण न आ जाए जिसमें कई दस्तावेज़ों को एक साथ "मर्ज" किया जाता है. जैसे, aggregate(...) या distinct(...). कई दस्तावेज़ों को "मर्ज" करने वाले चरणों के बाद, वैरिएबल के रेफ़रंस का इस्तेमाल नहीं किया जा सकता. ऐसा इसलिए, क्योंकि पिछले चरण के नतीजों को एक साथ मर्ज करने से, वैरिएबल के लिए अब एक वैल्यू नहीं रहती.

करें: दस्तावेज़ के फ़ील्ड को फ़िल्टर करने के बाद, किसी वैरिएबल को रेफ़रंस करें.

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

ऐसा न करें: एग्रीगेशन के बाद किसी वैरिएबल को रेफ़रंस करें.

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

अनडिफ़ाइंड रेफ़रंस:

किसी ऐसे फ़ील्ड को रेफ़रंस करना ठीक है जिसकी वैल्यू तय नहीं की गई है. हालांकि, ऐसा करने पर वैल्यू absent के तौर पर दिखेगी. वहीं, किसी ऐसे वैरिएबल को रेफ़रंस करने की कोशिश करने पर, अनुरोध की पुष्टि के दौरान गड़बड़ी होगी जिसकी वैल्यू तय नहीं की गई है. इस तरह, फ़ील्ड रेफ़रंस को रनटाइम के दौरान मैप में लुकअप करने के तौर पर देखा जा सकता है. वहीं, वैरिएबल रेफ़रंस, स्टैटिक तौर पर कंपाइल की गई प्रोग्रामिंग भाषा में वैरिएबल के ज़्यादा मिलते-जुलते होते हैं.

ग्लोबल स्कोप और सबक्वेरी

नेस्ट की गई पाइपलाइन के साथ काम करते समय, वैरिएबल ज़रूरी होते हैं. सब-पाइपलाइन, अपने स्कोप में काम करती है. साथ ही, यह सिर्फ़ उन दस्तावेज़ों के फ़ील्ड ऐक्सेस कर सकती है जिन्हें वह फ़िलहाल प्रोसेस कर रही है. सबक्वेरी में "पैरंट" दस्तावेज़ की वैल्यू का इस्तेमाल करने के लिए, आपको पहले इसे let(...) स्टेज का इस्तेमाल करके, वैरिएबल के तौर पर तय करना होगा.

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

ओवरलैप होने वाले वैरिएबल

अगर किसी वैरिएबल को ऐसे नाम से तय किया जाता है जिसे पहले let(...) स्टेज में तय किया गया था, तो पिछले वैरिएबल की जगह नया वैरिएबल दिखेगा. इसका इस्तेमाल, पाइपलाइन के आगे बढ़ने पर अस्थायी स्थिति को अपडेट करने के लिए किया जा सकता है.

सब-पाइपलाइन में रेफ़र किए गए वैरिएबल, लेक्सिकल स्कोपिंग के नियमों का पालन करते हैं. ये नियम, कई प्रोग्रामिंग भाषाओं में मिलते हैं. साथ ही, ये नियम, सबसे नज़दीकी (पैरंट) पाइपलाइन में एक ही नाम से तय किए गए वैरिएबल पर लागू होते हैं.

add_fields(...) से तुलना

let(...) स्टेज, add_fields(...) स्टेज की तरह ही काम करता है. हालांकि, यह दस्तावेज़ में फ़ील्ड जोड़ने के बजाय, वैरिएबल को वैल्यू असाइन करता है.