MongoDB এর Aggregation Framework হল একটি শক্তিশালী উপাদান যা ডেটা প্রসেসিং, বিশ্লেষণ এবং রূপান্তরের জন্য ব্যবহৃত হয়। এটি MongoDB ডেটাবেসে ডেটার উপর অ্যাগ্রিগেশন অপারেশন চালানোর জন্য ব্যবহৃত হয়, যেমন ডেটা গ্রুপিং, ফিল্টারিং, সোর্টিং, গননা ইত্যাদি। MongoDB অ্যাগ্রিগেশন ফ্রেমওয়ার্কে বিভিন্ন স্টেজ থাকে, যার মাধ্যমে আপনি ডেটার উপর বিভিন্ন অপারেশন করতে পারেন।
MongoDB এর অ্যাগ্রিগেশন পিপলাইন একটি সিরিজ স্টেজের মাধ্যমে ডেটাকে প্রসেস করে, যা প্রত্যেকটি স্টেজ ডেটাকে প্রক্রিয়া এবং রূপান্তর করে পরবর্তী স্টেজে পাঠায়।
Aggregation Framework এর মৌলিক ধারণা
MongoDB তে অ্যাগ্রিগেশন ফ্রেমওয়ার্কে সাধারণত দুটি প্রধান উপাদান থাকে:
- Aggregation Pipeline: এটি ডেটা প্রসেস করার জন্য স্টেজের একটি সিরিজ। প্রতিটি স্টেজ এক বা একাধিক অপারেশন সম্পাদন করে এবং পরবর্তী স্টেজে ডেটা পাঠায়।
- Aggregation Operators: এগুলি অ্যাগ্রিগেশন স্টেজে ব্যবহৃত হয়, যেমন
$match,$group,$sort,$projectইত্যাদি।
Aggregation Pipeline
MongoDB এর অ্যাগ্রিগেশন পিপলাইন একটি সিরিজ স্টেজের মাধ্যমে কাজ করে, যা ডেটার ওপর একাধিক অপারেশন প্রয়োগ করে। প্রতিটি স্টেজ একটি নির্দিষ্ট কাজ করে, এবং তার ফলাফল পরবর্তী স্টেজে পাঠানো হয়। অ্যাগ্রিগেশন পিপলাইন অপারেশনগুলো স্টেজের মাধ্যমে সংকলিত হয়।
Aggregation Pipeline এর স্টেজগুলো:
$match:
- এটি ডেটার উপর একটি ফিল্টার প্রয়োগ করে এবং কেবলমাত্র সেই ডকুমেন্টগুলো পরবর্তী স্টেজে পাঠায় যা নির্দিষ্ট শর্ত পূরণ করে। এটি
find()অপারেশনের মতো কাজ করে।
উদাহরণ:
db.collection.aggregate([ { $match: { age: { $gt: 30 } } } ])- এটি ডেটার উপর একটি ফিল্টার প্রয়োগ করে এবং কেবলমাত্র সেই ডকুমেন্টগুলো পরবর্তী স্টেজে পাঠায় যা নির্দিষ্ট শর্ত পূরণ করে। এটি
$group:
- এটি ডেটাকে গ্রুপ করে এবং প্রতিটি গ্রুপের উপর বিভিন্ন ধরনের অ্যাগ্রিগেশন অপারেশন চালায়, যেমন গননা, গড়, সর্বোচ্চ, সর্বনিম্ন ইত্যাদি।
উদাহরণ:
db.collection.aggregate([ { $group: { _id: "$city", total: { $sum: 1 } } } ])$sort:
- এটি ডেটাকে নির্দিষ্ট একটি কন্ডিশনে সোর্ট করে। আপনি একটি ফিল্ডের উপর ASCENDING বা DESCENDING অনুযায়ী সোর্ট করতে পারবেন।
উদাহরণ:
db.collection.aggregate([ { $sort: { age: -1 } } ])$project:
- এটি ডেটার কাঠামো পরিবর্তন করতে ব্যবহার করা হয়, যেমন নির্দিষ্ট ফিল্ডগুলো তুলে ধরা, নতুন ফিল্ড যোগ করা বা পুরানো ফিল্ড বাদ দেওয়া।
উদাহরণ:
db.collection.aggregate([ { $project: { name: 1, age: 1 } } ])$limit:
- এটি পিপলাইন থেকে একটি নির্দিষ্ট সংখ্যক ডকুমেন্ট বেছে নেয়। এটি কেবলমাত্র প্রাথমিক ডেটার সীমিত অংশ প্রদান করে।
উদাহরণ:
db.collection.aggregate([ { $limit: 5 } ])$skip:
- এটি ডেটার একটি নির্দিষ্ট অংশ বাদ দিয়ে বাকি অংশ প্রসেস করতে ব্যবহৃত হয়। এটি সোজা ভাষায়, প্রথম Xটি ডকুমেন্ট বাদ দিয়ে বাকি ডকুমেন্টগুলো ফিল্টার করে।
উদাহরণ:
db.collection.aggregate([ { $skip: 5 } ])$unwind:
- এটি একটি অ্যারে ফিল্ডকে "unwind" (বিকল্পভাবে প্রতিটি উপাদানকে আলাদা ডকুমেন্টে রূপান্তর) করতে ব্যবহৃত হয়। এটি একাধিক উপাদান সম্বলিত অ্যারে ডকুমেন্টকে পৃথক পৃথক ডকুমেন্টে পরিণত করে।
উদাহরণ:
db.collection.aggregate([ { $unwind: "$items" } ])
Aggregation Operators
MongoDB অ্যাগ্রিগেশন অপারেটর ব্যবহার করে ডেটা পরিবর্তন ও বিশ্লেষণ করা হয়। কিছু জনপ্রিয় অ্যাগ্রিগেশন অপারেটরের মধ্যে রয়েছে:
$sum:
- এটি গ্রুপিং অপারেশনে সংখ্যার সমষ্টি বের করতে ব্যবহৃত হয়।
উদাহরণ:
db.collection.aggregate([ { $group: { _id: "$city", totalAge: { $sum: "$age" } } } ])$avg:
- এটি গড় মান বের করতে ব্যবহৃত হয়।
উদাহরণ:
db.collection.aggregate([ { $group: { _id: "$city", averageAge: { $avg: "$age" } } } ])$min এবং $max:
- এটি সর্বনিম্ন এবং সর্বোচ্চ মান বের করতে ব্যবহৃত হয়।
উদাহরণ:
db.collection.aggregate([ { $group: { _id: "$city", minAge: { $min: "$age" }, maxAge: { $max: "$age" } } } ])$first এবং $last:
- এটি গ্রুপিংয়ের প্রথম বা শেষ ডকুমেন্টের মান বের করতে ব্যবহৃত হয়।
উদাহরণ:
db.collection.aggregate([ { $group: { _id: "$city", firstDoc: { $first: "$name" }, lastDoc: { $last: "$name" } } } ])$addFields:
- এটি নতুন ফিল্ড যোগ করার জন্য ব্যবহৃত হয়।
উদাহরণ:
db.collection.aggregate([ { $addFields: { fullName: { $concat: ["$firstName", " ", "$lastName"] } } } ])
সারাংশ
MongoDB এর Aggregation Framework হল একটি শক্তিশালী টুল যা ডেটা প্রসেসিং এবং বিশ্লেষণের জন্য ব্যবহৃত হয়। এটি ডেটা গ্রুপিং, ফিল্টারিং, সোর্টিং, গননা, গড় বের করা, এবং আরও অনেক ধরণের অপারেশন করার জন্য ডিজাইন করা হয়েছে। MongoDB অ্যাগ্রিগেশন ফ্রেমওয়ার্কের মাধ্যমে আপনি ডেটার উপর জটিল ক্যালকুলেশন, বিশ্লেষণ এবং রূপান্তর করতে পারেন। অ্যাগ্রিগেশন পিপলাইন এবং অপারেটরগুলি MongoDB তে ডেটা ম্যানিপুলেশন এবং বিশ্লেষণের জন্য একটি অত্যন্ত কার্যকরী পদ্ধতি প্রদান করে।
Aggregation হলো MongoDB এর একটি শক্তিশালী ফিচার, যা ডেটা বিশ্লেষণ, প্রক্রিয়াকরণ এবং সারাংশ তৈরি করার জন্য ব্যবহৃত হয়। MongoDB তে aggregation ডেটাকে এক বা একাধিক স্টেপে প্রক্রিয়াকরণ করে একটি কাঙ্খিত আউটপুট প্রদান করে। এটি ডেটার উপর বিভিন্ন ধরণের অপারেশন যেমন গ্রুপিং, ফিল্টারিং, সোর্টিং, এবং অ্যাগ্রিগেশন ক্যালকুলেশন (যেমন গননা, গড়, সর্বোচ্চ/নূন্যতম মান নির্ধারণ) করার জন্য ব্যবহৃত হয়।
MongoDB তে aggregation সাধারণত aggregation pipeline ব্যবহার করে করা হয়, যা একটি স্টেপ-by-স্টেপ প্রসেস। এই পিপলাইনটি একটি সিকোয়েন্সের মাধ্যমে একাধিক স্টেজে ডেটা প্রক্রিয়া করে এবং প্রতিটি স্টেজ পরবর্তী স্টেজে ডেটা পাঠায়।
Aggregation Pipeline
MongoDB তে aggregation পিপলাইন একটি তালিকা হিসেবে কাজ করে, যেখানে প্রতিটি তালিকা একটি stage (স্টেজ) এর মাধ্যমে ডেটাকে প্রক্রিয়াকরণ করে। প্রতিটি স্টেজ ডেটাতে একটি নির্দিষ্ট কাজ করে এবং তার পরবর্তী স্টেজে ডেটা প্রেরণ করে।
Aggregation Pipeline এর স্টেজসমূহ:
- $match:
এই স্টেজটি MongoDB ডেটাবেস থেকে নির্দিষ্ট শর্ত অনুযায়ী ডেটা ফিল্টার করে। এটি সাধারণত SQL এরWHEREক্লজের মতো কাজ করে।উদাহরণ:
db.collectionName.aggregate([ { $match: { age: { $gt: 30 } } } ])এই কুয়েরি ডেটাবেস থেকে সেই সব ডকুমেন্ট বের করবে যেখানে বয়স ৩০ এর বেশি।
- $group:
এই স্টেজটি ডেটাকে একটি নির্দিষ্ট কিপর্যায়ে গ্রুপ করে। আপনি এতে অ্যাগ্রিগেশন ক্যালকুলেশন (যেমন গড়, গননা, সর্বোচ্চ/নূন্যতম মান) করতে পারেন।উদাহরণ:
db.collectionName.aggregate([ { $group: { _id: "$age", total: { $sum: 1 } } } ])এখানে ডেটাকে বয়সের ভিত্তিতে গ্রুপ করা হয়েছে এবং প্রতিটি বয়সের জন্য ডকুমেন্টের সংখ্যা গোনা হচ্ছে।
- $sort:
এই স্টেজটি ডেটা সজ্জিত করার জন্য ব্যবহৃত হয় (ascending/descending)। এটি SQL এরORDER BYক্লজের মতো কাজ করে।উদাহরণ:
db.collectionName.aggregate([ { $sort: { age: 1 } } ])এখানে ডেটাকে বয়স অনুসারে ascending অর্ডারে সাজানো হচ্ছে।
- $project:
এই স্টেজটি ডেটার ফিল্ডসমূহকে কাস্টমাইজ বা পরিবর্তন করতে ব্যবহৃত হয়। আপনি নতুন ফিল্ড তৈরি করতে পারেন বা আগের ফিল্ডগুলো বাদ দিতে পারেন।উদাহরণ:
db.collectionName.aggregate([ { $project: { name: 1, age: 1, isAdult: { $gte: ["$age", 18] } } } ])এখানে একটি নতুন
isAdultফিল্ড তৈরি হচ্ছে, যাtrueঅথবাfalseহবে, নির্ভর করেageফিল্ডের মান ১৮ এর বেশি কিনা।
- $limit:
এই স্টেজটি ডেটার একটি নির্দিষ্ট সংখ্যা রিটার্ন করে।উদাহরণ:
db.collectionName.aggregate([ { $limit: 5 } ])এখানে সর্বাধিক ৫টি ডকুমেন্ট রিটার্ন করা হবে।
- $skip:
এই স্টেজটি ডেটার প্রথম N সংখ্যক ডকুমেন্ট বাদ দেয়। এটি SQL এরLIMIT OFFSETএর মতো কাজ করে।উদাহরণ:
db.collectionName.aggregate([ { $skip: 10 } ])এখানে প্রথম ১০টি ডকুমেন্ট বাদ দিয়ে পরবর্তী ডকুমেন্টগুলো রিটার্ন করা হবে।
- $unwind:
এই স্টেজটি একটি অ্যারে ফিল্ডকে একাধিক ডকুমেন্টে বিভক্ত করে। এটি JSON অ্যারে গঠনকে স্ট্রাকচার করে প্রতিটি উপাদানকে আলাদা ডকুমেন্টে রূপান্তর করে।উদাহরণ:
db.collectionName.aggregate([ { $unwind: "$tags" } ])এখানে
tagsঅ্যারের প্রতিটি উপাদানকে আলাদা ডকুমেন্টে রূপান্তরিত করা হচ্ছে।
- $addFields:
এই স্টেজটি নতুন ফিল্ড যোগ করতে ব্যবহৃত হয় বা আগের ফিল্ডগুলোর মান পরিবর্তন করতে ব্যবহৃত হয়।উদাহরণ:
db.collectionName.aggregate([ { $addFields: { fullName: { $concat: ["$firstName", " ", "$lastName"] } } } ])এখানে
fullNameনামক একটি নতুন ফিল্ড তৈরি হচ্ছে যাfirstNameএবংlastNameফিল্ডগুলির মান একত্রিত করে।
Aggregation এর উদাহরণ
উদাহরণ ১: গ্রুপিং এবং গননা
ডেটা গ্রুপ করে প্রতিটি গ্রুপের ডকুমেন্ট সংখ্যা গোনা:
db.orders.aggregate([
{ $group: { _id: "$product", totalOrders: { $sum: 1 } } }
])
এখানে, প্রতিটি পণ্য (product) ভিত্তিতে ডেটা গ্রুপ করা হচ্ছে এবং প্রতিটি গ্রুপের মধ্যে মোট অর্ডারের সংখ্যা গোনা হচ্ছে।
উদাহরণ ২: ডেটা ফিল্টারিং এবং সোর্টিং
বয়স ৩০ এর বেশি এমন ব্যবহারকারীদের ডেটা সজ্জিত করা:
db.users.aggregate([
{ $match: { age: { $gt: 30 } } },
{ $sort: { name: 1 } }
])
এখানে প্রথমে বয়স ৩০ এর বেশি ব্যবহারকারীদের ফিল্টার করা হচ্ছে এবং তারপর তাদের নামের ভিত্তিতে ascending অর্ডারে সাজানো হচ্ছে।
উদাহরণ ৩: অ্যাগ্রিগেশন পিপলাইন এবং প্রজেকশন
ডেটার নির্দিষ্ট ফিল্ড কাস্টমাইজ করা:
db.users.aggregate([
{ $project: { fullName: { $concat: ["$firstName", " ", "$lastName"] }, age: 1 } }
])
এখানে fullName নামক নতুন ফিল্ড তৈরি করা হচ্ছে, যা firstName এবং lastName এর মান নিয়ে গঠিত এবং age ফিল্ডটিও রিটার্ন হচ্ছে।
সারাংশ
MongoDB তে aggregation ডেটা প্রক্রিয়াকরণ এবং বিশ্লেষণের জন্য একটি শক্তিশালী টুল। এটি ডেটাকে বিভিন্ন স্টেপে প্রক্রিয়াকরণ করে নির্দিষ্ট ফলাফল প্রদান করে, যা ডেটার ওপর গ্রুপিং, সোর্টিং, ফিল্টারিং এবং অন্যান্য অ্যাগ্রিগেশন অপারেশন করতে সহায়তা করে। Aggregation Pipeline এর মাধ্যমে MongoDB তে ডেটা প্রক্রিয়াকরণ খুবই নমনীয় এবং সহজে কাস্টমাইজ করা যায়, যা বড় ডেটাবেসের জন্য একটি গুরুত্বপূর্ণ সুবিধা।
MongoDB তে অ্যাগ্রিগেশন পিপলাইন ব্যবহারের মাধ্যমে ডেটা প্রসেস এবং বিশ্লেষণ করা হয়। এই পিপলাইনে বিভিন্ন স্টেজ থাকে, এবং $match, $group, এবং $project হল তিনটি গুরুত্বপূর্ণ স্টেজ যা MongoDB তে ডেটা ফিল্টারিং, গ্রুপিং এবং প্রজেকশনের জন্য ব্যবহৃত হয়।
1. $match অপারেটর
$match অপারেটর MongoDB অ্যাগ্রিগেশন পিপলাইনে ডেটা ফিল্টার করতে ব্যবহৃত হয়। এটি কুয়েরি অপারেশন ব্যবহার করে, যাতে নির্দিষ্ট শর্ত পূর্ণ করে এমন ডকুমেন্টগুলো নির্বাচন করা হয়।
সিনট্যাক্স:
{ $match: { <query> } }
<query>: কুয়েরি শর্ত (যেমন:{ age: { $gt: 30 } })
ব্যবহার:
বয়সের ভিত্তিতে ফিল্টার:
db.users.aggregate([ { $match: { age: { $gt: 30 } } } ])এই কুয়েরি "users" কালেকশনের ডকুমেন্টগুলো থেকে সেই ডকুমেন্টগুলো ফিল্টার করবে যাদের বয়স ৩০ এর বেশি।
নামের ভিত্তিতে ফিল্টার:
db.users.aggregate([ { $match: { name: "John" } } ])এই কুয়েরি "users" কালেকশনের মধ্যে
nameএর মান "John" থাকা ডকুমেন্টগুলো নির্বাচন করবে।
2. $group অপারেটর
$group অপারেটর MongoDB তে গ্রুপিং করতে ব্যবহৃত হয়। এটি একটি অ্যাগ্রিগেশন স্টেজ, যা নির্দিষ্ট ফিল্ডের ভিত্তিতে ডকুমেন্টগুলোকে গ্রুপ করে এবং গ্রুপের উপর বিভিন্ন ধরনের অ্যাগ্রিগেশন অপারেশন চালায়।
সিনট্যাক্স:
{ $group: { _id: <field>, <aggregationOperations> } }
_id: গ্রুপ করার জন্য নির্বাচিত ফিল্ড (যেমন:age,name, ইত্যাদি)<aggregationOperations>: গ্রুপ করা ডেটার ওপর বিভিন্ন অপারেশন যেমনsum,avg,max,min,countইত্যাদি।
ব্যবহার:
বয়স অনুসারে গ্রুপিং এবং গননা:
db.users.aggregate([ { $group: { _id: "$age", totalUsers: { $sum: 1 } } } ])এই কুয়েরি "users" কালেকশনের ডকুমেন্টগুলো বয়স অনুসারে গ্রুপ করে এবং প্রতিটি বয়সের জন্য মোট কতজন ব্যবহারকারী আছেন তা গণনা করবে।
নামের ভিত্তিতে গ্রুপিং এবং গড় বয়স নির্ধারণ:
db.users.aggregate([ { $group: { _id: "$name", avgAge: { $avg: "$age" } } } ])এই কুয়েরি "users" কালেকশনের ডকুমেন্টগুলোকে নামের ভিত্তিতে গ্রুপ করে এবং প্রতিটি নামের জন্য গড় বয়স বের করবে।
3. $project অপারেটর
$project অপারেটর MongoDB অ্যাগ্রিগেশন পিপলাইনে ডেটার প্রজেকশন (ফিল্ড নির্বাচিত করা) করতে ব্যবহৃত হয়। এটি কেবল নির্দিষ্ট ফিল্ডগুলোকেই রিটার্ন করে, যা আপনি নির্ধারণ করেন।
সিনট্যাক্স:
{ $project: { <field1>: <value1>, <field2>: <value2>, ... } }
<field1>,<field2>: ফিল্ডের নাম যেগুলো আপনি প্রজেক্ট করতে চান।<value1>,<value2>:1বা0এর মান, যেখানে1মানে ফিল্ডটি অন্তর্ভুক্ত করা হবে এবং0মানে ফিল্ডটি বাদ দেওয়া হবে।
ব্যবহার:
নির্দিষ্ট ফিল্ড প্রজেক্ট করা:
db.users.aggregate([ { $project: { name: 1, age: 1 } } ])এই কুয়েরি "users" কালেকশনের
nameএবংageফিল্ডগুলোকেই রিটার্ন করবে এবং অন্যান্য ফিল্ড বাদ দিবে।নতুন ফিল্ড তৈরি করে প্রজেক্ট করা:
db.users.aggregate([ { $project: { name: 1, age: 1, ageInMonths: { $multiply: ["$age", 12] } } } ])এই কুয়েরি "users" কালেকশনের
nameএবংageফিল্ডগুলো রিটার্ন করবে, সাথেageInMonthsনামের নতুন ফিল্ড তৈরি করবে, যা বয়সের ভিত্তিতে মাসে পরিণত হবে।
সারাংশ
MongoDB তে $match, $group, এবং $project অপারেটরগুলি অ্যাগ্রিগেশন পিপলাইনের গুরুত্বপূর্ণ অংশ। $match অপারেটর ব্যবহার করে ডেটা ফিল্টার করা হয়, $group অপারেটর দিয়ে ডেটাকে গ্রুপ করা হয় এবং $project অপারেটর দিয়ে ডেটার ফিল্ড প্রজেক্ট বা নির্বাচিত করা হয়। এই অপারেশনগুলির মাধ্যমে MongoDB তে ডেটা বিশ্লেষণ এবং প্রসেসিং খুবই শক্তিশালী এবং নমনীয় হয়।
MongoDB তে Pipeline এবং Stage অ্যাগ্রিগেশন অপারেশন তৈরির মূল অংশ। অ্যাগ্রিগেশন পিপলাইন ব্যবহার করে আপনি ডেটার উপর বিভিন্ন অপারেশন (যেমন: ফিল্টার, গ্রুপ, সোর্ট, ইত্যাদি) একে একে কার্যকর করতে পারেন। MongoDB অ্যাগ্রিগেশন পিপলাইন খুবই শক্তিশালী এবং ফ্লেক্সিবল, যা ডেটাকে বিভিন্নভাবে প্রক্রিয়া করতে সক্ষম।
1. Pipeline
MongoDB তে Pipeline হল একটি সিরিজ বা ধারাবাহিক স্টেজের একটি সেট, যা ডেটার উপর বিভিন্ন ধরনের প্রক্রিয়া (অপারেশন) চালানোর জন্য ব্যবহৃত হয়। প্রতিটি পিপলাইন একাধিক স্টেজের সমষ্টি হয়, এবং প্রতিটি স্টেজ আগের স্টেজের আউটপুটকে ইনপুট হিসেবে গ্রহণ করে।
MongoDB অ্যাগ্রিগেশন পিপলাইন ব্যবহার করে আপনি বিভিন্ন অপারেশন (যেমন: match, group, sort) একে একে ডেটার উপর চালাতে পারেন এবং শেষে একটি প্রক্রিয়া করা ফলাফল পেতে পারেন।
পিপলাইন অপারেশনটি বিভিন্ন স্টেজের মাধ্যমে ডেটার উপর একাধিক কাজ চালানোর সুযোগ দেয়। পিপলাইনে অন্তর্ভুক্ত স্টেজগুলি খুবই নমনীয় এবং কার্যকরীভাবে ডেটা বিশ্লেষণ করতে সহায়তা করে।
2. Stage
Stage হল একটি নির্দিষ্ট অপারেশন যা MongoDB অ্যাগ্রিগেশন পিপলাইনে চলে। প্রতিটি স্টেজ একটি নির্দিষ্ট কাজ সম্পাদন করে এবং পিপলাইনের পরবর্তী স্টেজে ফলাফল সরবরাহ করে। MongoDB অ্যাগ্রিগেশন পিপলাইনে ব্যবহৃত বেশ কিছু স্টেজ রয়েছে, যার মধ্যে সবচেয়ে সাধারণ স্টেজগুলির মধ্যে উল্লেখযোগ্য:
$match: একটি স্টেজ যা কুয়েরি শর্তের মাধ্যমে ডেটা ফিল্টার করে। এটি সাধারণতfind()কুয়েরির মতো কাজ করে এবং ডেটাকে কন্ডিশন অনুযায়ী ফিল্টার করে।{ $match: { age: { $gte: 30 } } }এই স্টেজে
ageএর মান ৩০ বা তার বেশি হলে ডেটা মেলে।$group: ডেটাকে গ্রুপ করার জন্য ব্যবহৃত হয়। এটি বিশেষত ব্যবহৃত হয় গাণিতিক অপারেশন (যেমন: গড়, সংখ্যা গণনা, সর্বোচ্চ মান, ইত্যাদি) করার জন্য।{ $group: { _id: "$age", total: { $sum: 1 } } }এখানে
ageঅনুযায়ী ডেটা গ্রুপ করে এবং প্রতিটি গ্রুপের জন্য মোট সংখ্যা গণনা করা হয়।$sort: ডেটাকে সারণী (ascending) বা অবতরণী (descending) আকারে সাজানোর জন্য ব্যবহৃত হয়।{ $sort: { age: 1 } }এখানে
ageএর উপর ডেটা সারণীভাবে সাজানো হচ্ছে (ascending order)।$limit: ডেটার সংখ্যা সীমিত করতে ব্যবহৃত হয়। এই স্টেজটি একাধিক ডেটা আইটেম থেকে একটি নির্দিষ্ট সংখ্যক আইটেম নির্বাচন করতে ব্যবহার করা হয়।{ $limit: 5 }এই স্টেজটি ডেটার প্রথম ৫টি আইটেম নির্বাচন করবে।
$skip: একটি নির্দিষ্ট সংখ্যক ডেটা আইটেম উপেক্ষা (skip) করতে ব্যবহৃত হয়।{ $skip: 5 }এই স্টেজটি প্রথম ৫টি আইটেম স্কিপ করে পরবর্তী আইটেমগুলো দেখাবে।
$project: ডেটার ফিল্ড সমূহকে কাস্টমাইজ করে। এটি ডেটার কিছু ফিল্ডকে অন্তর্ভুক্ত বা বাদ দিতে ব্যবহৃত হয়।{ $project: { name: 1, age: 1 } }এখানে
nameএবংageফিল্ডসমূহকে প্রজেক্ট করা হচ্ছে, অন্য ফিল্ডসমূহ বাদ দেওয়া হচ্ছে।
3. অ্যাগ্রিগেশন পিপলাইন স্টেজের সমন্বয়
MongoDB তে অ্যাগ্রিগেশন পিপলাইন একাধিক স্টেজের সমন্বয়ে তৈরি হয়, এবং প্রত্যেকটি স্টেজের আউটপুট পরবর্তী স্টেজে ইনপুট হিসেবে ব্যবহার হয়। একাধিক স্টেজ ব্যবহার করে আপনি ডেটা বিশ্লেষণ করতে পারেন, ডেটাকে সাজাতে পারেন, গ্রুপ করতে পারেন, এবং আরও অনেক কিছু।
একটি উদাহরণ অ্যাগ্রিগেশন পিপলাইন দেখুন, যা age অনুযায়ী গ্রুপ করে এবং তারপর সেগুলোকে সঠিকভাবে সাজায়:
db.users.aggregate([
{ $match: { age: { $gte: 18 } } }, // বয়স ১৮ বা তার বেশি হওয়া ডেটা ফিল্টার করুন
{ $group: { _id: "$age", total: { $sum: 1 } } }, // বয়স অনুযায়ী গ্রুপ করুন এবং মোট গণনা করুন
{ $sort: { total: -1 } } // মোট গননা অনুযায়ী অবতরণীভাবে সাজান
])
এই পিপলাইনে:
- প্রথমে
$matchস্টেজ ব্যবহার করে বয়স ১৮ বা তার বেশি হওয়া ডেটা ফিল্টার করা হয়েছে। - তারপর
$groupস্টেজের মাধ্যমে গ্রুপ করা হয়েছেageঅনুসারে এবং প্রতিটি গ্রুপের মোট সংখ্যা গণনা করা হয়েছে। - অবশেষে,
$sortস্টেজ ব্যবহার করে মোট সংখ্যার উপর অবতরণীভাবে সাজানো হয়েছে।
4. পিপলাইন এবং স্টেজের মধ্যে পার্থক্য
- Pipeline: একটি পিপলাইন হলো একাধিক স্টেজের একটি ধারাবাহিক সেট যা একে একে ডেটার উপর অপারেশন চালায়। এটি MongoDB তে অ্যাগ্রিগেশন অপারেশন করার প্রক্রিয়া।
- Stage: একটি স্টেজ হলো একটি নির্দিষ্ট অপারেশন যা MongoDB অ্যাগ্রিগেশন পিপলাইনে চলে। প্রতিটি স্টেজ একটি নির্দিষ্ট কাজ সম্পাদন করে এবং পরবর্তী স্টেজের ইনপুট হিসেবে কাজ করে।
সারাংশ
MongoDB অ্যাগ্রিগেশন পিপলাইন একটি শক্তিশালী ফিচার, যা ডেটা প্রক্রিয়া এবং বিশ্লেষণে সহায়তা করে। একটি পিপলাইন একাধিক স্টেজের মাধ্যমে ডেটার উপর কাজ করে এবং প্রতিটি স্টেজের ফলাফল পরবর্তী স্টেজে ইনপুট হিসেবে ব্যবহার হয়। Pipeline এবং Stage এর ধারণা MongoDB তে ডেটাবেস ব্যবস্থাপনায় নমনীয়তা এবং স্কেলেবিলিটি নিশ্চিত করে, যা বিশেষত বড় পরিসরের ডেটা বিশ্লেষণের জন্য উপযোগী।
MongoDB তে অ্যাগ্রিগেশন একটি শক্তিশালী বৈশিষ্ট্য, তবে ডেটার পরিমাণ বাড়ার সাথে সাথে জটিল অ্যাগ্রিগেশন কুয়েরিগুলোর পারফরম্যান্সে প্রভাব পড়তে পারে। অ্যাগ্রিগেশন পারফরম্যান্স টিউনিং MongoDB তে গুরুত্বপূর্ণ, যাতে ডেটাবেসের কার্যকারিতা দ্রুত এবং দক্ষ থাকে, বিশেষ করে বড় ডেটাসেট ব্যবহারের সময়। এখানে কিছু কৌশল দেওয়া হলো যা আপনাকে অ্যাগ্রিগেশন পারফরম্যান্স টিউনিংয়ে সহায়তা করবে।
1. ইনডেক্সিং এর ব্যবহার
ইনডেক্স ডেটাবেসে কুয়েরি অপারেশন দ্রুত করতে সাহায্য করে। অ্যাগ্রিগেশন কুয়েরি অপারেশনগুলির মধ্যে বিশেষভাবে $match এবং $sort এর জন্য ইনডেক্স ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ। তবে, MongoDB সব অ্যাগ্রিগেশন স্টেজে ইনডেক্স ব্যবহার করতে পারে না, যেমন $group স্টেজে।
$matchএর জন্য ইনডেক্স তৈরি করুন:
যদি অ্যাগ্রিগেশন কুয়েরির প্রথম স্টেজে$matchথাকে, তাহলে নিশ্চিত করুন যে সেই ফিল্ডের ওপর ইনডেক্স তৈরি করা আছে।db.collection.createIndex({ age: 1 }) db.collection.aggregate([{ $match: { age: { $gte: 30 } } }])$sortএর জন্য ইনডেক্স তৈরি করুন:
যদি আপনার অ্যাগ্রিগেশন কুয়েরিতে$sortথাকে, তাহলে নিশ্চিত করুন যে সেই ফিল্ডে ইনডেক্স আছে।db.collection.createIndex({ name: 1 }) db.collection.aggregate([{ $sort: { name: 1 } }])কম্পাউন্ড ইনডেক্স:
একাধিক ফিল্ডের ওপর$matchশর্ত দিলে, কম্পাউন্ড ইনডেক্স ব্যবহার করতে পারেন। এটি ডেটার উপর দ্রুত অনুসন্ধান করতে সাহায্য করে।db.collection.createIndex({ age: 1, status: 1 }) db.collection.aggregate([{ $match: { age: { $gte: 30 }, status: 'active' } }])
2. $project স্টেজের প্রাথমিক ব্যবহার
MongoDB তে $project স্টেজ ডেটা কিভাবে বের হবে তা নির্ধারণ করে। $project স্টেজটি যত দ্রুত সম্ভব ব্যবহৃত হলে, পরবর্তী স্টেজে প্রক্রিয়া করা ডেটার পরিমাণ কমে যায়, যা পারফরম্যান্স উন্নত করে।
অপ্রয়োজনীয় ফিল্ড বাদ দিন:
যদি আপনার কেবল কিছু নির্দিষ্ট ফিল্ডের প্রয়োজন হয়, তবে$projectব্যবহার করে অপ্রয়োজনীয় ফিল্ড বাদ দিন।db.collection.aggregate([ { $project: { _id: 0, name: 1, age: 1 } }, { $match: { age: { $gte: 30 } } } ])
এইভাবে, পরবর্তী স্টেজে কম ডেটা প্রক্রিয়া করা হয়, যা পারফরম্যান্সে সহায়ক।
3. ডেটা প্রাথমিকভাবে সীমাবদ্ধ করা (Limit, Skip)
যত তাড়াতাড়ি সম্ভব ডেটা সীমাবদ্ধ করলে পরবর্তী স্টেজগুলোতে কম ডেটা আসবে এবং কুয়েরি দ্রুত হবে। $limit এবং $skip ব্যবহার করে আপনি অ্যাগ্রিগেশন পাইপলাইনকে আরও কার্যকরী করতে পারেন।
$limitব্যবহার করুন:
যদি আপনি কেবল কিছু ডকুমেন্ট চাচ্ছেন, তবে$limitব্যবহার করুন। এটি ডেটার পরিমাণ কমিয়ে পারফরম্যান্স বৃদ্ধি করবে।db.collection.aggregate([ { $match: { status: 'active' } }, { $limit: 100 }, { $group: { _id: '$age', total: { $sum: 1 } } } ])$skipএবং$limitব্যবহার করুন:
যদি আপনি পেজিনেশন প্রয়োগ করতে চান, তবে$skipএবং$limitএকসাথে ব্যবহার করুন।db.collection.aggregate([ { $match: { status: 'active' } }, { $skip: 50 }, { $limit: 50 } ])
4. $group স্টেজ অপটিমাইজেশন
$group স্টেজ MongoDB তে অনেক বেশি রিসোর্স ব্যবহার করে, কারণ এটি ডেটা গ্রুপিং এবং মেমরি ব্যবহার করে। পারফরম্যান্স টিউনিং করতে $group স্টেজে কিছু কৌশল অনুসরণ করা যেতে পারে।
প্রথমে
$projectব্যবহার করুন:$groupএর আগে$projectব্যবহার করে আপনি শুধু প্রয়োজনীয় ফিল্ডগুলো রাখতে পারেন। এতে মেমরি ব্যবহার কমে এবং পারফরম্যান্স বৃদ্ধি পায়।db.collection.aggregate([ { $project: { age: 1, status: 1 } }, { $group: { _id: "$age", count: { $sum: 1 } } } ])- গ্রুপিংয়ের পরিমাণ সীমাবদ্ধ করুন:
খুব বড় বা ইউনিক ফিল্ড দিয়ে গ্রুপ না করার চেষ্টা করুন, কারণ এতে বেশি গ্রুপ তৈরি হবে। সহজতর ফিল্ডে গ্রুপিং করা ভালো।
5. $unwind অপ্টিমাইজেশন
MongoDB তে $unwind স্টেজ আছেযখন কোনো অ্যারে ফিল্ডকে একাধিক ডকুমেন্টে ভাগ করা হয়। কিন্তু যখন অ্যারে বড় হয়, তখন এটি অনেক বেশি ডকুমেন্ট তৈরি করতে পারে, যা পারফরম্যান্সে নেতিবাচক প্রভাব ফেলতে পারে।
$projectএর মাধ্যমে অ্যারের আকার সীমাবদ্ধ করুন:
বড় অ্যারের ক্ষেত্রে$unwindএর আগে$projectব্যবহার করে অ্যারের আকার সীমাবদ্ধ করুন।db.collection.aggregate([ { $project: { items: { $slice: ["$items", 10] } } }, { $unwind: "$items" } ])$unwindএর সাথেpreserveNullAndEmptyArraysব্যবহার করুন:
যদি আপনি ফাঁকা অ্যারে ডকুমেন্ট প্রসেস করতে না চান, তবেpreserveNullAndEmptyArraysব্যবহার করুন।db.collection.aggregate([ { $unwind: { path: "$items", preserveNullAndEmptyArrays: true } } ])
6. $facet স্টেজ ব্যবহার করা
MongoDB তে $facet স্টেজের মাধ্যমে একাধিক অ্যাগ্রিগেশন পাইপলাইন একসাথে চালানো যায়। এটি একাধিক পারালাল ক্যালকুলেশন করার জন্য উপযুক্ত।
একাধিক পাইপলাইন চালান:
$facetএর মাধ্যমে একাধিক অ্যাগ্রিগেশন অপারেশন একসাথে চালাতে পারেন, যা সময় বাঁচায় এবং কার্যকরী হয়।db.collection.aggregate([ { $facet: { "groupByAge": [{ $group: { _id: "$age", total: { $sum: 1 } } }], "groupByStatus": [{ $group: { _id: "$status", total: { $sum: 1 } } }] } } ])
এটি আপনাকে একই ডেটাতে একাধিক বিশ্লেষণ করতে সাহায্য করে, যাতে একাধিক কুয়েরি চালানোর প্রয়োজন হয় না।
7. পারফরম্যান্স মনিটরিং এবং বিশ্লেষণ
MongoDB তে explain() পদ্ধতি ব্যবহার করে অ্যাগ্রিগেশন কুয়েরির কার্যকারিতা বিশ্লেষণ করা যায়। এটি আপনার কুয়েরির পরিকল্পনা এবং পারফরম্যান্স জানায়, যাতে আপনি অপ্টিমাইজেশন করতে পারেন।
explain()ব্যবহার করুন:explain()কুয়েরি স্ট্যাটিস্টিক্স প্রদান করে, যেমন কুয়েরি কীভাবে সম্পন্ন হচ্ছে এবং কোথায় পারফরম্যান্স সমস্যা হচ্ছে।db.collection.aggregate([{ $match: { age: { $gte: 30 } } }]).explain("executionStats")
এটি আপনাকে কুয়েরির প্রকৃত কার্যকরী পরিকল্পনা দেখাবে, যা আরো দ্রুত কুয়েরি তৈরি করতে সাহায্য করবে।
সারাংশ
MongoDB তে অ্যাগ্রিগেশন পারফরম্যান্স টিউনিং করা ডেটাবেসের কর্মক্ষমতা উন্নত করতে খুবই গুরুত্বপূর্ণ। ইনডেক্সিং, কুয়েরি অপ্টিমাইজেশন, $project, $limit এবং $skip ব্যবহার, অপ্রয়োজনীয় ডেটা ফিল্টারিং, এবং $group বা $unwind অপারেশনগুলির যথাযথ ব্যবহার অ্যাগ্রিগেশন পারফরম্যান্স বৃদ্ধি করতে সহায়ক। MongoDB তে explain() পদ্ধ
তি ব্যবহার করে কুয়েরির কার্যকারিতা বিশ্লেষণ করলে আরো দক্ষ কুয়েরি তৈরি করা সম্ভব।
Read more