সাবকোয়েরির সাথে যোগ করুন

এক নজরে

Firestore Enterprise এডিশন সম্পর্কিত সাবকোয়েরির মাধ্যমে রিলেশনাল-স্টাইল জয়েন করার সুবিধা দেয়। অনেক NoSQL ডেটাবেসের মতো নয়, যেগুলিতে প্রায়ই ডেটা ডিনর্মালাইজ করতে হয় বা একাধিক ক্লায়েন্ট-সাইড অনুরোধ করতে হয়, সাবকোয়েরি আপনাকে সরাসরি সার্ভারে সম্পর্কিত কালেকশন বা সাবকালেকশন থেকে ডেটা একত্রিত ও অ্যাগ্রিগেট করতে দেয়।

সাবকোয়েরি হল এমন এক্সপ্রেশন যা বাইরের কোয়েরির মাধ্যমে প্রসেস করা প্রতিটি ডকুমেন্টের জন্য নেস্টেড পাইপলাইন এক্সিকিউট করে। এটি জটিল ডেটা রিট্রিভাল প্যাটার্নকে সক্ষম করে, যেমন কোনও ডকুমেন্টকে তার সম্পর্কিত সাবকালেকশন আইটেমের সাথে আনা বা বিভিন্ন রুট কালেকশন জুড়ে যৌক্তিকভাবে লিঙ্ক করা ডেটা যোগ করা।

ধারণা

এই বিভাগে পাইপলাইন অপারেশনে জয়েন পারফর্ম করার জন্য সাবকোয়েরি ব্যবহারের মূল ধারণাগুলি পরিচয় করিয়ে দেওয়া হয়েছে।

এক্সপ্রেশন হিসেবে সাবকোয়েরি

সাবকোয়েরি কোনও টপ-লেভেল স্টেজ নয়; পরিবর্তে, এটি হল একটি এক্সপ্রেশন যা এক্সপ্রেশন গ্রহণ করে এমন যেকোনও স্টেজে ব্যবহার করা যেতে পারে, যেমন select(...), add_fields(...), where(...), অথবা sort(...)।

Cloud Firestore তিন ধরনের সাবকোয়েরি সাপোর্ট করে:

  • অ্যারে সাবকোয়েরি: সাবকোয়েরির সম্পূর্ণ ফলাফল সেটকে ডকুমেন্টের অ্যারে হিসেবে মেটেরিয়ালাইজ করুন।
  • স্কেলার সাবকোয়েরি: একটি একক ভ্যালু মূল্যায়ন করে, যেমন একটি গণনা, একটি গড়, বা একটি সম্পর্কিত ডকুমেন্ট থেকে একটি নির্দিষ্ট ফিল্ড।
  • subcollection(...) সাবকোয়েরি: একটির-সাথে-অনেক প্যারেন্ট-চাইল্ড সম্পর্কের জন্য সরলীকৃত জয়েন।

স্কোপ ও ভেরিয়েবল

কোনও জয়েন লেখার সময়, নেস্টেড সাবকোয়েরির ক্ষেত্রে প্রায়ই "আউটার" ডকুমেন্ট (পেরেন্ট) থেকে ফিল্ড রেফারেন্স করার প্রয়োজন হয়। এই স্কোপগুলি ব্রিজ করতে, আপনি let(...) স্টেজ (কিছু SDK-তে define(...) হিসেবে উল্লেখ করা হয়) ব্যবহার করেন প্যারেন্ট স্কোপে ভেরিয়েবল সংজ্ঞায়িত করতে যা পরে variable(...) ফাংশন ব্যবহার করে সাবকোয়েরিতে রেফারেন্স করা যেতে পারে।

সিনট্যাক্স

নিম্নলিখিত বিভাগগুলি থেকে আপনি যোগ করার সিনট্যাক্স সম্পর্কে এক নজরে জানতে পারবেন।

let(...) স্টেজ

let(...) স্টেজ (কিছু SDK-তে define(...) হিসেবে উল্লেখ করা হয়) হল একটি নন-ফিল্টারিং স্টেজ যা স্পষ্টভাবে পেরেন্ট স্কোপ থেকে ডেটা নিয়ে আসে পরবর্তী নেস্টেড স্কোপে ব্যবহারের জন্য একটি নামযুক্ত ভেরিয়েবলে।

অ্যারে সাবকোয়েরি

অ্যারে সাবকোয়েরি হল এক্সপ্রেশন সাবকোয়েরির একটি বিশেষ কেস যা সাবকোয়েরির সম্পূর্ণ ফলাফল সেটকে একটি অ্যারেতে পরিণত করে। সাবকোয়েরি শূন্য সারি ফেরত দিলে, এটি খালি অ্যারে হিসেবে মূল্যায়ন করে। এটি কখনও null অ্যারে দেখায় না। এই ধরনের কোয়েরি তখন উপযোগী হয় যখন চূড়ান্ত ফলাফলে সম্পূর্ণ ফলাফল প্রয়োজন হয়, যেমন নেস্টেড বা সম্পর্কিত কালেকশন মেটেরিয়ালাইজ করার সময়।

কোয়েরি সাবকোয়েরিতে ফিল্টার, সাজানো ও অ্যাগ্রিগেট করতে পারে যাতে ফেচ ও রিটার্ন করার জন্য প্রয়োজনীয় ডেটার পরিমাণ কমানো যায়। এর ফলে কোয়েরির খরচও কমে। সাবকোয়েরির ক্রম বজায় রাখা হয়, অর্থাৎ সাবকোয়েরিতে sort(...) স্টেজ চূড়ান্ত অ্যারেতে ফলাফলের ক্রম নিয়ন্ত্রণ করে।

কোনও কোয়েরিকে অ্যারেতে কনভার্ট করতে toArrayExpression() SDK র‍্যাপার ব্যবহার করুন।

স্কেলার সাবকোয়েরি

স্কেলার সাবকোয়েরি প্রায়শই select(...) বা where(...) স্টেজে ব্যবহার করা হয়, কারণ এটি সম্পূর্ণ কোয়েরি সরাসরি মেটেরিয়ালাইজ না করেই সাবকোয়েরির ফলাফল ফিল্টার বা জেনারেট করার অনুমতি দেয়।

একটি স্কেলার সাবকোয়েরি যা শূন্য ফলাফল তৈরি করে তা নিজেই null-এ মূল্যায়ন করবে, যখন একটি সাবকোয়েরি যা একাধিক এলিমেন্টে মূল্যায়ন করে তার ফলে রানটাইম সমস্যা হবে।

যখন একটি স্কেলার সাবকোয়েরি প্রতি-ফলাফলে শুধুমাত্র একটি ফিল্ড তৈরি করে, তখন ফিল্ডটি সাবকোয়েরির জন্য শীর্ষ-স্তরের ফলাফল হিসেবে উন্নত করা হয়। সাবকোয়েরি select(field("user_name")) বা aggregate(countAll().as("total")) দিয়ে শেষ হলে এটি সবচেয়ে বেশি দেখা যায়, যেখানে সাবকোয়েরির স্কিমা হল একটি ফিল্ড। অন্যথায়, সাবকোয়েরি একাধিক ফিল্ড তৈরি করলে, সেগুলি ম্যাপে র‍্যাপ করা হয়।

একটি কোয়েরিকে স্কেলার এক্সপ্রেশনে পরিবর্তন করতে toScalarExpression() SDK র‍্যাপার ব্যবহার করুন।

subcollection(...) সাবকোয়েরি

একটি স্টেজ হিসেবে অফার করা হলেও, subcollection(...) ইনপুট স্টেজ Cloud Firestore-এর হায়ারার্কিক্যাল ডেটা মডেলের উপর জয়েন করার অনুমতি দেয়। হায়ারার্কিক্যাল মডেলে, কোয়েরির ক্ষেত্রে প্রায়ই নিজস্ব সাবকালেকশন থেকে ডেটার পাশাপাশি ডকুমেন্ট ফিরিয়ে আনার প্রয়োজন হয়। আপনি এটি করতে পারেন collection_group(...) ইনপুট স্টেজের পরে পেরেন্ট রেফারেন্সে ফিল্টার ব্যবহার করে, subcollection(...) আরও অনেক বেশি সংক্ষিপ্ত সিনট্যাক্স প্রদান করে।

ইমপ্লিসিট জয়েন কন্ডিশন ছাড়া, এটি অ্যারে সাবকোয়েরির মতো কাজ করে, কোনও ডকুমেন্ট ম্যাচ না করলে খালি ফলাফল দেখায়, এমনকি নেস্টেড কালেকশন না থাকলেও।

এটি মূলত সিনট্যাকটিক সুগার: এটি অটোমেটিক বাইরের স্কোপে ডকুমেন্টের __name__-কে জয়েন কী হিসেবে ব্যবহার করে যাতে হায়ারার্কিকাল সম্পর্ক সমাধান করা যায়। এর ফলে, পেরেন্ট-চাইল্ড সম্পর্কে লিঙ্ক করা কালেকশন জুড়ে লুকআপ করার জন্য এটিই সবচেয়ে ভালো উপায়।

উদাহরণ

উদাহরণ ডেটা

নিম্নলিখিত উদাহরণে ব্যবহার করার জন্য টেস্ট ডেটার সেট লোড করা হয়।

Node.js

// Load set of cities.
const cities = db.collection("cities");

await cities.doc("SF").set({
  name: "San Francisco",
  state: "CA",
  country: "USA",
});
await cities.doc("LA").set({
  name: "Los Angeles",
  state: "CA",
  country: "USA"
});
await cities.doc("DC").set({
  name: "Washington, D.C.",
  state: null,
  country: "USA"
});
await cities.doc("TOK").set({
  name: "Tokyo",
  state: null,
  country: "Japan"
});

// Load restaurants in various cities.
const sfRestaurants = db.collection("cities/SF/restaurants");
const laRestaurants = db.collection("cities/LA/restaurants");
const dcRestaurants = db.collection("cities/DC/restaurants");

const rest1 = await sfRestaurants.add({
  name: "Golden Gate Pizza",
  type: "pizza",
  owner_id: "Mario Rossi"
});
const rest2 = await sfRestaurants.add({
  name: "Bay Area Burger",
  type: "burger",
  owner_id: "Sarah Jenkins"
});
const rest3 = await sfRestaurants.add({
  name: "Sunset Taco",
  type: "mexican",
  owner_id: "Edward"
});

const rest4 = await laRestaurants.add({
  name: "Hollywood Sushi",
  type: "sushi",
  owner_id: "Ken Kenji"
});
const rest5 = await laRestaurants.add({
  name: "Venice Pizza",
  type: "pizza",
  owner_id: "Luigi Romano"
});

const rest6 = await dcRestaurants.add({
  name: "Capitol Tacos",
  type: "mexican",
  owner_id: "Maria Garcia"
});
const rest7 = await dcRestaurants.add({
  name: "Georgetown Coffee",
  type: "cafe",
  owner_id: "David Kim"
});

// Load collection of reviews.
const reviews = db.collection("reviews");

await reviews.add({ restaurant: rest1, rating: 5, reviewer_id: "Alice" });
await reviews.add({ restaurant: rest1, rating: 4, reviewer_id: "Bob" });
await reviews.add({ restaurant: rest2, rating: 4, reviewer_id: "Charlie" });
await reviews.add({ restaurant: rest3, rating: 5, reviewer_id: "Diana" });
await reviews.add({ restaurant: rest3, rating: 4, reviewer_id: "Edward" });
await reviews.add({ restaurant: rest3, rating: 4, reviewer_id: "Fiona" });
// rest4 has 0 reviews
await reviews.add({ restaurant: rest5, rating: 3, reviewer_id: "George" });
await reviews.add({ restaurant: rest6, rating: 5, reviewer_id: "Hannah" });
await reviews.add({ restaurant: rest6, rating: 4, reviewer_id: "Ian" });
await reviews.add({ restaurant: rest7, rating: 5, reviewer_id: "Julia" });

অন্য সংগ্রহে কোনও ডকুমেন্ট খোঁজা

reviews কালেকশন গ্রুপের নিম্নলিখিত কোয়েরি, প্রাথমিক কী রেফারেন্স ব্যবহার করে restaurant কালেকশন গ্রুপে লুকআপ পারফর্ম করে।

Node.js

let results = await db.pipeline()
  .collectionGroup("reviews")
  .define(field("restaurant").as("restaurant_name"))
  .addFields(db.pipeline()
    .collectionGroup("restaurant")
    .where(field("__name__").equal(variable("restaurant_name")))
    .select("name", "type")
    .toScalarExpression()
    .as("restaurant"))
  .execute();

প্রতিক্রিয়া

{
  rating: 5,
  reviewer_id "Alice",
  restaurant: { name: "Golden Gate Pizza", type: "pizza" }
},
{
  rating: 4,
  reviewer_id "Bob",
  restaurant: { name: "Golden Gate Pizza", type: "pizza" }
},
{
  rating: 4,
  reviewer_id "Charlie",
  restaurant: { name: "Bay Area Burger", type: "burger" }
},
{
  rating: 5,
  reviewer_id "Diana",
  restaurant: { name: "Sunset Taco", type: "mexican" }
},
{
  rating: 4,
  reviewer_id "Edward",
  restaurant: { name: "Sunset Taco", type: "mexican" }
},
{
  rating: 4,
  reviewer_id "Fiona",
  restaurant: { name: "Sunset Taco", type: "mexican" }
},
{
  rating: 3,
  reviewer_id "George",
  restaurant: { name: "Venice Pizza", type: "pizza" }
},
{
  rating: 5,
  reviewer_id "Hannah",
  restaurant: { name: "Capitol Tacos", type: "mexican" }
},
{
  rating: 4,
  reviewer_id "Ian",
  restaurant: { name: "Capitol Tacos", type: "mexican" }
},
{
  rating: 5,
  reviewer_id "Julia",
  restaurant: { name: "Georgetown Coffee", type: "cafe" }
}

একাধিক কালেকশন একত্রিত করুন

নিম্নলিখিত কোয়েরি restaurants কালেকশন গ্রুপ থেকে সব পিৎজা প্লেস নিয়ে আসে এবং অ্যারে সাবকোয়েরি ব্যবহার করে সেগুলির সাথে যুক্ত রিভিউ নিয়ে আসে ও সরাসরি উত্তরে এম্বেড করে।

Node.js

let results = await db.pipeline()
  .collectionGroup("restaurants")
  .where(field("type").equal("pizza"))
  .define(field("__name__").as("restaurant_name"))
  .select(
    field("name"),
    db.pipeline()
      .collectionGroup("reviews")
      .where(field("restaurant").equal(variable("restaurant_name")))
      .select("rating", "reviewer_id")
      .toArrayExpression()
      .as("reviews"))
  .execute();

প্রতিক্রিয়া

{
  name: "Golden Gate Pizza",
  reviews: [
    { rating: 5, reviewer_id "Alice" },
    { rating: 4, reviewer_id "Bob" }
  ]
},
{
  name: "Venice Pizza",
  type: "pizza",
  owner_id: "Luigi Romano",
  reviews: [
    { rating: 3, reviewer_id "George" }
  ]
}

একাধিক কালেকশন জুড়ে এগ্রিগেট করুন

restaurants কালেকশন গ্রুপের নিম্নলিখিত কোয়েরিটি reviews কালেকশন গ্রুপ থেকে প্রতিটি রেস্তোরাঁর গড় রেটিং পেতে একটি সম্পর্কিত সাবকোয়েরি ব্যবহার করে।

Node.js

let results = await db.pipeline()
  .collectionGroup("restaurants")
  .where(field("type").equal("pizza"))
  .define(field("__name__").as("restaurant_name"))
  .select(
    field("name"),
    db.pipeline()
      .collectionGroup("reviews")
      .where(field("restaurant").equal(variable("restaurant_name")))
      .aggregate(average("rating").as("avg_rating"))
      .toScalarExpression()
      .as("avg_rating"))
  .execute();

প্রতিক্রিয়া

{
  name: "Golden Gate Pizza",
  avg_rating: 4.5
},
{
  name: "Venice Pizza",
  avg_rating: 3.0
}

প্রতি গ্রুপে টপ-N (সীমা সহ সাবকোয়েরি)

নিম্নলিখিত কোয়েরি restaurants কালেকশন গ্রুপ থেকে সব ডকুমেন্ট নিয়ে আসে এবং প্রতিটি রেস্তোরাঁর জন্য সবচেয়ে বেশি রেটিং পাওয়া সেরা ২টি রিভিউ নিয়ে আসতে একটি সম্পর্কিত সাবকোয়েরি ব্যবহার করে।

এটি নিশ্চিত করে যে রিভিউয়ের অ্যারে খুব বেশি বড় না হয় এবং কোয়েরির মেমরি সীমা ছাড়িয়ে না যায়।

Node.js

let results = await db.pipeline()
  .collectionGroup("restaurants")
  .define(field("__name__").as("restaurant_name"))
  .select(
    field("name"),
    db.pipeline()
      .collectionGroup("reviews")
      .where(field("restaurant").equal(variable("restaurant_name")))
      .sort(field("rating").descending())
      .limit(2)
      .select("rating", "reviewer_id")
      .toArrayExpression()
      .as("top_reviews"))
  .execute();

প্রতিক্রিয়া

{
  name: "Golden Gate Pizza",
  top_reviews: [
    { rating: 5, reviewer_id "Alice" },
    { rating: 4, reviewer_id "Bob" }
  ]
},
{
  name: "Bay Area Burger",
  top_reviews: [
    { rating: 4, reviewer_id "Charlie" }
  ]
},
{
  name: "Sunset Taco",
  top_reviews: [
    { rating: 5, reviewer_id "Diana" },
    { rating: 4, reviewer_id "Edward" }
  ]
},
{
  name: "Hollywood Sushi",
  top_reviews: []
},
{
  name: "Venice Pizza",
  top_reviews: [
    { rating: 3, reviewer_id "George" }
  ]
},
{
  name: "Capitol Tacos",
  top_reviews: [
    { rating: 5, reviewer_id "Hannah" },
    { rating: 4, reviewer_id "Ian" }
  ]
},
{
  name: "Georgetown Coffee",
  top_reviews: [
    { rating: 5, reviewer_id "Julia" }
  ]
}

সাবকালেকশন যোগ দিন

নিম্নলিখিত কোয়েরি cities কালেকশন স্ক্যান করে এবং subcollection(...) স্টেজ ব্যবহার করে নেস্টেড কালেকশন থেকে ডকুমেন্ট ইমপ্লিসিটলি যোগ করে প্রতিটি শহরের রেস্তোরাঁর সংখ্যা খোঁজে।

Node.js

let results = await db.pipeline()
  .collection("cities")
  .addFields(subcollection("restaurants")
    .toArrayExpression()
    .length()
    .as("restaurant_count"))
  .execute();

প্রতিক্রিয়া

{
  __name__: cities/SF,
  name: "San Francisco",
  state: "CA",
  country: "USA",
  restaurant_count: 3
},
{
  __name__: cities/LA,
  name: "Los Angeles",
  state: "CA",
  country: "USA",
  restaurant_count: 2
},
{
  __name__: cities/DC,
  name: "Washington, D.C.",
  state: null,
  country: "USA",
  restaurant_count: 2
},
{
  __name__: cities/TOK,
  name: "Tokyo",
  state: null,
  country: "Japan",
  restaurant_count: 0
}

একাধিক যোগদানের শর্ত প্রকাশ করুন

নিম্নলিখিত কোয়েরি restaurants কালেকশন গ্রুপ স্ক্যান করে এবং reviews কালেকশন গ্রুপের সাথে মাল্টি-ফিল্ড জয়েন পারফর্ম করে যাতে সেইসব মালিকদের খুঁজে পাওয়া যায় যারা নিজেদের রেস্তোরাঁ রিভিউ করছেন।

Node.js

let results = await db.pipeline()
  .collectionGroup("restaurants")
  .define(field("owner_id"), field("__name__"))
  .where(db.pipeline()
    .collectionGroup("reviews")
    .where(field("restaurant").equal(variable("__name__")))
    .where(field("author").equal(variable("owner_id")))
    .aggregate(count().as("c"))
    .toScalarExpression()
    .greaterThan(0))
  .execute();

প্রতিক্রিয়া

{
  __name__: cities/SF/restaurants/X9An0HIlx29A9GPuRthS,
  name: "Sunset Taco",
  type: "mexican",
  owner_id: "Edward"
}

অ্যান্টি-জয়েন (NOT EXISTS)

নিম্নলিখিত কোয়েরি restaurants কালেকশন গ্রুপ স্ক্যান করে এবং এমন সব রেস্তোরাঁ খুঁজে বের করে যেগুলির এখনও কোনও রিভিউ নেই।

Node.js

let results = await db.pipeline()
  .collectionGroup("restaurants")
  .define(field("__name__").as("restaurant_name"))
  .where(db.pipeline()
    .collectionGroup("reviews")
    .where(field("restaurant").equal(variable("restaurant_name")))
    .aggregate(count().as("review_count"))
    .toScalarExpression()
    .equal(0))
  .execute();

প্রতিক্রিয়া

{
  __name__: "cities/LA/restaurants/X9An0HIlx29A9GPuRthS",
  name: "Hollywood Sushi",
  type: "sushi",
  owner_id: "Ken Kenji"
}

যোগদান হিসেবে সাবকোয়েরি

নিম্নলিখিত কোয়েরি প্রতিটি পিৎজা প্লেস এবং তার রিভিউয়ের মধ্যে সম্পর্ককে ফ্ল্যাটেন করে। unnest(...) স্টেজের মধ্যে সাবকোয়েরি প্লেস করার মাধ্যমে, সার্ভার প্রতিটি ম্যাচিং রিভিউয়ের জন্য বাইরের রেস্তোরাঁ ডকুমেন্ট ডুপ্লিকেট করে, ফ্ল্যাট, জয়েন করা ডকুমেন্ট তৈরি করে (SQL INNER JOIN-এর মতো)।

Node.js

let results = await db.pipeline()
  .collectionGroup("restaurants")
  .where(field("type").equal("pizza"))
  .define(field("__name__").as("restaurant_name"))
  .unnest(
    db.pipeline()
      .collectionGroup("reviews")
      .where(field("restaurant").equal(variable("restaurant_name")))
      .select("rating", "reviewer_id")
      .toArrayExpression()
      .as("review"))
  .execute();

প্রতিক্রিয়া

{
  __name__: "cities/SF/restaurants/xU4pu8nFpnJDPZOwcSPP",
  name: "Golden Gate Pizza",
  type: "pizza",
  owner_id: "Mario Rossi"
  review: { rating: 5, reviewer_id "Alice" }
},
{
  __name__: "cities/SF/restaurants/xU4pu8nFpnJDPZOwcSPP",
  name: "Golden Gate Pizza",
  type: "pizza",
  owner_id: "Mario Rossi",
  review: { rating: 4, reviewer_id "Bob" }
},
{
  __name__: "cities/LA/restaurants/6CYntvNgbYzgaW652Gq1",
  name: "Venice Pizza",
  type: "pizza",
  owner_id: "Luigi Romano",
  review: { rating: 3, reviewer_id "George" }
}

ফিল্টার হিসেবে সম্পর্কহীন সাবকোয়েরি

reviews সংগ্রহে নিম্নলিখিত কোয়েরিটি গড় রেটিংয়ের চেয়ে বেশি রেটিংয়ের রিভিউ খুঁজতে নিজের উপর একটি সম্পর্কহীন সাবকোয়েরি ব্যবহার করে ফিল্টার করে।

Node.js

let results = await db.pipeline()
  .collection("reviews")
  // Average review rating is 4.3
  .where(field("rating").greaterThan(db.pipeline()
    .collection("reviews")
    .aggregate(average("rating").as("avg"))
    .toScalarExpression()))
  .select("rating", "reviewer_id")
  .execute();

প্রতিক্রিয়া

{
  rating: 5,
  reviewer_id "Alice"
},
{
  rating: 5,
  reviewer_id "Diana"
},
{
  rating: 5,
  reviewer_id "Hannah"
},
{
  rating: 5,
  reviewer_id "Julia"
}

পেশাদার পদ্ধতি

  • toArrayExpression()-এর সাহায্যে মেমরি ম্যানেজ করা: toArrayExpression() সাবকোয়েরি ব্যবহার করার সময় সতর্ক থাকুন, কারণ অনেক সংখ্যক ডকুমেন্ট মেটেরিয়ালাইজ করলে কোয়েরি মেমরি সীমা (১২৮ MiB) শেষ হয়ে যেতে পারে। এটি কমাতে, সাবকোয়েরির মধ্যে select(...) ব্যবহার করুন যাতে শুধুমাত্র প্রয়োজনীয় ফিল্ডই দেখানো হয় এবং where(...) ফিল্টার প্রয়োগ করুন যাতে দেখানো ডকুমেন্টের সংখ্যা সীমিত করা যায়। সাবকোয়েরি দ্বারা রিটার্ন করা ডকুমেন্টের সংখ্যা সীমিত করতে, উপযুক্ত হলে limit(...) ব্যবহার করার কথা বিবেচনা করুন।
  • ইনডেক্সিং: সাবকোয়েরির where(...) ক্লজে ব্যবহৃত ফিল্ড ইনডেক্স করা হয়েছে কিনা তা নিশ্চিত করুন। পারফর্ম্যান্ট জয়েন সম্পূর্ণ টেবিল স্ক্যান করার পরিবর্তে ইন্ডেক্স খোঁজার ক্ষমতার উপর নির্ভর করে।

কোয়েরি সংক্রান্ত আরও পেশাদার পদ্ধতির জন্য, আমাদের কোয়েরি অপ্টিমাইজেশন সংক্রান্ত নির্দেশিকা দেখুন।

সীমাবদ্ধতা

  • subcollection(...) স্কোপ: subcollection(...) ইনপুট স্টেজ শুধুমাত্র সাবকোয়েরির মধ্যে কাজ করে, কারণ হায়ারার্কিকাল সম্পর্ক সমাধান করতে এবং যোগ করতে এটির জন্য একটি পেরেন্ট ডকুমেন্টের প্রসঙ্গ প্রয়োজন।
  • নেস্টিং ডেপথ: সাবকোয়েরি ২০টি লেয়ার পর্যন্ত নেস্ট করা যেতে পারে।
  • মেমরির ব্যবহার: মেটেরিয়ালাইজড ডেটার ক্ষেত্রে ১২৮ MiB-এর সীমা সম্পূর্ণ কোয়েরি জুড়ে প্রযোজ্য হয়, যার মধ্যে সব যোগ করা ডকুমেন্টও অন্তর্ভুক্ত।