সমষ্টি

বর্ণনা

` aggregate(...) পর্যায়টি পূর্ববর্তী পর্যায় থেকে প্রাপ্ত ডকুমেন্টগুলো থেকে সমষ্টিগত ফলাফল (যেমন গণনা, যোগফল) গণনা করে।

ঐচ্ছিকভাবে, যখন একটি গ্রুপিং এক্সপ্রেশন প্রদান করা হয়, তখন এটি প্রদত্ত এক্সপ্রেশনগুলোর উপর ভিত্তি করে ডকুমেন্টগুলোকে গ্রুপ করে এবং তারপর প্রতিটি গ্রুপের উপর অ্যাকুমুলেটর ফাংশন প্রয়োগ করে।

উদাহরণ

গ্রুপ-বাই ছাড়া অ্যাগ্রিগেশনের ক্ষেত্রে, aggregate(...) ধাপে এক বা একাধিক অ্যালিয়াসযুক্ত অ্যাগ্রিগেটর এক্সপ্রেশন গৃহীত হয়:

নোড.জেএস

const cities = await db.pipeline()
  .collection("/cities")
  .aggregate(
      countAll().as("total"),
      average("population").as("avg_population")
  )
  .execute();

গ্রুপিং সহ অ্যাগ্রিগেশনের ক্ষেত্রে, অ্যাগ্রিগেটরগুলো ছাড়াও অতিরিক্ত গ্রুপ প্রয়োজন হয়:

নোড.জেএস

const result = await db.pipeline()
  .collectionGroup('citites')
  .aggregate({
    accumulators: [
      countAll().as('cities'),
      field('population').sum().as('total_popoluation')
    ],
    groups: [field('location.state').as('state')]
  })
  .execute();

আচরণ

দলবদ্ধকরণ ছাড়া সমষ্টি

নিম্নলিখিত নথিগুলি দিয়ে একটি cities সংগ্রহ তৈরি করুন:

নোড.জেএস

await db.collection('cities').doc('SF').set({name: 'San Francisco', state: 'CA', country: 'USA', population: 870000});
await db.collection('cities').doc('LA').set({name: 'Los Angeles', state: 'CA', country: 'USA', population: 3970000});
await db.collection('cities').doc('NY').set({name: 'New York', state: 'NY', country: 'USA', population: 8530000});
await db.collection('cities').doc('TOR').set({name: 'Toronto', state: null, country: 'Canada', population: 2930000});
await db.collection('cities').doc('MEX').set({name: 'Mexico City', state: null, country: 'Mexico', population: 9200000});

শহরগুলোর মোট সংখ্যা ও সেগুলোর গড় জনসংখ্যা বের করতে:

নোড.জেএস

const cities = await db.pipeline()
  .collection("/cities")
  .aggregate(
      countAll().as("total"),
      average("population").as("avg_population")
  )
  .execute();

যা উৎপাদন করে:

{avg_population: 5100000, total: 5}

গ্রুপগুলির উপর অ্যাগ্রিগেশন সম্পাদন করুন

` groups আর্গুমেন্ট সরবরাহ করে, আপনি প্রতিটি স্বতন্ত্র গ্রুপের উপর অ্যাগ্রিগেশন সম্পাদন করতে পারেন।

উদাহরণস্বরূপ, প্রতিটি দেশ এবং প্রতিটি রাজ্যের সর্বাধিক জনসংখ্যার শহরটি খুঁজে বের করতে:

নোড.জেএস

const cities = await db.pipeline()
  .collection("/cities")
  .aggregate({
      accumulators: [
          countAll().as("number_of_cities"),
          maximum("population").as("max_population")
      ],
      groups: ["country", "state"]
  })
  .execute();

যা দেয়:

{country: "USA", state: "CA", max_population: 3970000, number_of_cities: 2},
{country: "USA", state: "NY", max_population: 8530000, number_of_cities: 1},
{country: "Canada", state: null, max_population: 2930000, number_of_cities: 1},
{country: "Mexico", state: null,  max_population: 9200000, number_of_cities: 1}

দলবদ্ধকরণের উপর জটিল অভিব্যক্তি

শুধুমাত্র ফিল্ড ভ্যালুর উপর ভিত্তি করে গ্রুপিং ছাড়াও, aggregate(...) স্টেজটি জটিল এক্সপ্রেশনের ফলাফলের উপর ভিত্তি করে গ্রুপিং সমর্থন করে। select স্টেজে বৈধ এমন যেকোনো এক্সপ্রেশনকে গ্রুপিং কী হিসেবে ব্যবহার করা যেতে পারে। এটি ক্যালকুলেটেড ভ্যালু বা শর্তের উপর ভিত্তি করে নমনীয় গ্রুপিংয়ের সুযোগ দেয়।

উদাহরণস্বরূপ, স্টেট ফিল্ডটি নাল কিনা তার ভিত্তিতে গ্রুপ করতে এবং প্রতিটি গ্রুপের মোট জনসংখ্যা বের করতে:

নোড.জেএস

const cities = await db.pipeline()
  .collection("/cities")
  .aggregate({
      accumulators: [
         sum("population").as("total_population")
      ],
      groups: [equal(field("state"), null).as("state_is_null")]
  })
  .execute();

ফিরে আসবে:

{state_is_null: true, total_population: 12130000}
{state_is_null: false, total_population: 13370000}

সমষ্টিগত আচরণ

প্রতিটি সমর্থিত ফাংশনের (যেমন count , sum , avg ) অ্যাগ্রিগেশন আচরণ ‘অ্যাগ্রিগেট ফাংশন’- এর জন্য নির্ধারিত পৃষ্ঠায় পাওয়া যাবে।

গ্রুপ মূল আচরণ

ডকুমেন্ট গ্রুপ করার সময়, ভ্যালুগুলো একই গ্রুপের অন্তর্গত কিনা তা নির্ধারণ করতে ফায়ারস্টোর ইকুয়ালিটি সেম্যান্টিকস ব্যবহার করে।

এর মানে হলো, সমতুল্য মানগুলো, যেমন গাণিতিকভাবে সমতুল্য সাংখ্যিক মান, তাদের মূল প্রকার (৩২-বিট পূর্ণসংখ্যা, ৬৪-বিট পূর্ণসংখ্যা, ফ্লোটিং পয়েন্ট সংখ্যা, দশমিক১২৮, ইত্যাদি) নির্বিশেষে, সবগুলোকে একসাথে গোষ্ঠীভুক্ত করা হয়।

উদাহরণস্বরূপ, numerics নামক একটি সংগ্রহে, যেখানে বিভিন্ন ডকুমেন্টে যথাক্রমে ৩২-বিট পূর্ণসংখ্যা 1 , ৬৪-বিট পূর্ণসংখ্যা 1L এবং ফ্লোটিং-পয়েন্ট সংখ্যা 1.0 এর foo মান রয়েছে, সেগুলোকে একই গ্রুপে একত্রিত করা হবে। foo অনুসারে গ্রুপ করে একটি গণনা চালালে যা ফেরত আসবে তা হলো:

{foo: 1.0, count: 3}

ডেটা সেটে বিভিন্ন সমতুল্য মান উপস্থিত থাকার ক্ষেত্রে, গ্রুপটির আউটপুট মান এই সমতুল্য মানগুলোর যেকোনো একটি হতে পারে। এই উদাহরণে, foo 1 , 1L , বা 1.0 হতে পারে।

যদিও এটিকে সুনিশ্চিত বলে মনে হয়, তবুও একটি নির্দিষ্ট মান নির্বাচিত হবে—এই আচরণের উপর নির্ভর করার চেষ্টা করা উচিত নয়

মেমরি ব্যবহার

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

অত্যন্ত বেশি সংখ্যক গ্রুপ থাকলে, অথবা প্রতিটি গ্রুপ খুব বড় হলে (যেমন বিশাল মানের ভিত্তিতে গ্রুপ করার ক্ষেত্রে), এই পর্যায়ে মেমোরি শেষ হয়ে যেতে পারে।

এই ধরনের ক্ষেত্রে, বেশি মেমরি ব্যবহার এড়ানোর জন্য আপনার উচিত ডেটাসেটকে অ্যাগ্রিগেট করার জন্য ফিল্টার প্রয়োগ করা, কম সংখ্যক ফিল্ডের উপর ভিত্তি করে গ্রুপিং করা, অথবা সুপারিশ অনুযায়ী ইনডেক্স তৈরি করা। কোয়েরি এক্সপ্লেইন প্রকৃত কোয়েরি এক্সিকিউশন প্ল্যান এবং প্রোফাইলিং ডেটা সম্পর্কে তথ্য প্রদান করবে, যা ডিবাগিং-এ সাহায্য করবে।