বর্ণনা
subcollection(...) ইনপুট স্টেজটি বিল্ট-ইন __name__ ফিল্ড ব্যবহার করে প্যারেন্ট-চাইল্ড জয়েন করা সহজ করে তোলে।
নেস্টেড ডকুমেন্টগুলোর উপর ফিল্টারিং বা অ্যাগ্রিগেশন করার জন্য subcollection(...) স্টেজের সাথে অতিরিক্ত স্টেজ যুক্ত করা যেতে পারে। মনে রাখবেন যে, পরবর্তী স্টেজগুলোতে ব্যবহৃত যেকোনো ফিল্ড রেফারেন্স নেস্টেড কালেকশনের ডকুমেন্টগুলোকে নির্দেশ করে, প্যারেন্ট ডকুমেন্টকে নয়। প্যারেন্ট স্কোপের ফিল্ডগুলো রেফার করার জন্য, প্রথমে let(...) স্টেজ ব্যবহার করে ভ্যারিয়েবল সংজ্ঞায়িত করুন, তারপর লোকাল স্কোপে সেই ভ্যারিয়েবলগুলো রেফারেন্স করুন।
উদাহরণ
নোড.জেএস
db.pipeline()
.collection("/restaurants")
.add_fields(subcollection("reviews")
.aggregate(average("rating").as("avg_rating"))
.toScalarExpression()
.as("avg_rating"))
আচরণ
` subcollection(...) পর্যায়টি অবশ্যই একটি সাবকোয়েরির প্রেক্ষাপটে ব্যবহার করতে হবে। এটি কোন সাব-কালেকশনটি ফেচ করতে হবে তা নির্ধারণ করার জন্য প্যারেন্ট স্কোপে থাকা বর্তমান ডকুমেন্টের ` __name__ (ডকুমেন্ট রেফারেন্স) ব্যবহার করে। উদাহরণস্বরূপ, যদি প্যারেন্ট ডকুমেন্টটি /restaurants/pizza-place হয়, তাহলে subcollection("reviews") /restaurants/pizza-place/reviews কালেকশন থেকে সমস্ত ডকুমেন্ট রিটার্ন করবে।
যদি ডকুমেন্ট রেফারেন্সের নাম পরিবর্তন করা হয়ে থাকে, অথবা __name__ দিয়ে কোনো ফিল্ড সংজ্ঞায়িত করা সম্ভব না হয়, তাহলে ম্যানুয়ালি জয়েনটি এভাবে লিখতে হবে:
নোড.জেএস
db.pipeline()
.collection("/restaurants")
.let(field("__name__").as("restaurant_name"))
.add_fields(db.pipeline()
.collectionGroup("reviews")
.where(field("__name__").parent().equals(variable("restaurant_name")))
.aggregate(average("rating").as("avg_rating"))
.toScalarExpression()
.as("avg_rating"))
এখনও সম্ভব, কারণ মৌলিকভাবে এই পর্যায়টি এই আরও জটিল জয়েন ফরম্যাটের উপর কেবল একটি সিনট্যাকটিক সুগার।
নিম্নলিখিত নথিগুলির জন্য:
নোড.জেএস
const restaurant1 = db.collection("restaurants").document("pizza-place");
const restaurant2 = db.collection("restaurants").document("urban-bite");
const restaurant3 = db.collection("restaurants").document("nacho-house");
await restaurant1.create({ name: "Pizza Place" });
await restaurant2.create({ name: "Urban Bite" });
await restaurant3.create({ name: "Nacho House" });
await restaurant1.collection("reviews").doc("1").create({ rating: 5 });
await restaurant1.collection("reviews").doc("1").create({ rating: 2 });
await restaurant2.collection("reviews").doc("1").create({ rating: 3 });
await restaurant2.collection("reviews").doc("1").create({ rating: 4 });
await restaurant2.collection("reviews").doc("1").create({ rating: 5 });
নিম্নলিখিত কোয়েরিটি প্রতিটি রেস্তোরাঁ খুঁজে বের করে এবং এর রিভিউগুলোকে একটি নতুন review_summary ফিল্ডে সংক্ষিপ্ত আকারে তুলে ধরে:
নোড.জেএস
const results = await db.pipeline()
.collectionGroup("restaurants")
.add_fields(subcollection("reviews")
.aggregate(
countAll().as("review_count"),
average("rating").as("avg_rating"))
.asScalarExpression()
.as("review_summary"))
.execute();
এবং নিম্নলিখিত ফলাফল প্রদান করে:
{ name: "Pizza Place", review_summary: { review_count: 2, avg_rating: 3.5 } },
{ name: "Urban Bite", review_summary: { review_count: 3, avg_rating: 4.0 } },
{ name: "Nacho House", review_summary: { review_count: 0, avg_rating: null } },