یہ باب MongoDB کی شماریاتی تجزیے کی تفصیلی وضاحت پیش کرتا ہے، جو عموماً Aggregation Pipeline کے ذریعے حاصل کیا جاتا ہے۔ یہ SQL میں "group by" اسٹیٹمنٹ کی طرح ہے۔ MongoDB shell میں شماریاتی تجزیہ، db.collection.aggregate() فنکشن کا استعمال کرکے پورا کیا جاتا ہے۔

پیش نیاز ٹیوٹوریل

MongoDB Aggregation Pipeline

عام اقدامات

  • $match کا استعمال تاریخ فلٹر کرنے کے لئے
  • $group کا استعمال ڈیٹا کی گروپ بندی اور حساب کتاب کرنے کے لئے
  • $sort کا استعمال نتائج کو ترتیب دینے کے لئے (اختیاری)

ٹیسٹ ڈیٹا

orders میں ڈیٹا مندرجہ ذیل ہے

{ _id: 1, cust_id: "abc1", ord_date: ISODate("2012-11-02T17:04:11.102Z"), status: "A", amount: 50 }
{ _id: 2, cust_id: "xyz1", ord_date: ISODate("2013-10-01T17:04:11.102Z"), status: "A", amount: 100 }
{ _id: 3, cust_id: "xyz1", ord_date: ISODate("2013-10-12T17:04:11.102Z"), status: "D", amount: 25 }
{ _id: 4, cust_id: "xyz1", ord_date: ISODate("2013-10-11T17:04:11.102Z"), status: "D", amount: 125 }
{ _id: 5, cust_id: "abc1", ord_date: ISODate("2013-11-12T17:04:11.102Z"), status: "A", amount: 25 }

aggregate فنکشن

db.collection.aggregate(pipeline) توضیح:

  • pipeline ایک ایرے پیرامیٹر لیتا ہے، جہاں ہر عنصر ایک پروسیسنگ اسٹیج کو ظاہر کرتا ہے۔

مثال

db.orders.aggregate([
                     { $match: { status: "A" } },  // پہلا اسٹیج
                     { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },   // دوسرا اسٹیج
                     { $sort: { total: -1 } }  // تیسرا اسٹیج
                   ])

مترادف SQL

select sum(amount) as total from orders 
        where status="A" 
        group by cust_id 
        order by total desc

$match Stage

فارمیٹ:

{ $match: { <query> } }

توضیح:

  • <query> MongoDB کی کوئیری حالات

کوئیری حالات تعین کرنے کے لئے استعمال ہوتا ہے۔ اگر $match نظرانداز کیا جائے تو یہ ہوگا کہ تمام ڈیٹا کی کوئیری کی جا رہی ہے۔

مشورہ: اگر آپ MongoDB کی کوئیری سنٹیکس سے واقف نہیں ہیں، تو براہ کرم پچھلے بابس کی تشریح کو دیکھیں۔

$group Stage

SQL میں group by کلوز کے طرح، یہ ڈیٹا کو گروپ بنانے کے لئے اور پھر گروپ بندی کردہ ڈیٹا پر سلسلہ وار شماریاتی حسابات کرنے کے لئے استعمال ہوتا ہے۔

$group کا بنیادی استعمال

سنٹیکس:

{
  $group:
    {
      _id: <expression>, // گروپنگ شرط، مثال کے طور پر: گروپ بائی کس فیلڈ کے لۓ
      <field1>: { <accumulator1> : <expression1> },  // ایگریگیشن عمل، آپ ایم ایم ٹو کی ایگریگیشن عمل جوڑ سکتے ہیں
      ...
    }
 }

توضیح:

  • - مخصوص شماریاتی انڈیکیٹر کا نام، کل ہو سکتے ہیں
  • - ایگریگیشن فنکشن، ایگریگیشن فنکشن سے مشابہ ہے، مثال کے طور پر sum, avg اور دیگر ایگریگیشن فنکشنس، امکان یہ ہے کہ مونگو ڈی بی کی ایگریگیشن فنکشنز کو$ کے ساتھ نام دیا گیا ہے، مثال کے طور پر: $sum, $avg
  • - ایگریگیشن فنکشن کا پیرامیٹر، عام طور پر شمار گرانے والی فیلڈ کی قیمت ہوتی ہے، فارمیٹ "$field name" کا استعمال کرکے دستاویز فیلڈ کا حوالہ دیتی ہے

مثال:

db.orders.aggregate([
                     {
					 	$group: { 
							_id: "$cust_id",
							total: { $sum: "$amount" }, // پہلا حسابنگری انڈیکیٹر ٹوٹل جوڑیں, $sum سماٹنے والے اپریٹر کا استعمال کریں
							amount_avg: {$avg: "$amount"}  // دوسری حسابنگری انڈیکیٹر اوسط کو استعمال کر کے اوسط قیمتیں حاصل کریں
						} 
					}
               ])

آؤٹ پٹ:

{ "_id" : "abc1", "total" : 75, "amount_avg" : 37.5 }
{ "_id" : "xyz1", "total" : 250, "amount_avg" : 83.33333333333333 }

مترادف SQL:

select 
	sum(amount) as  total,
	avg(amount) as amount_avg
from orders 
group by cust_id

$گروپ کلرتی فعل

$گروپ کے لئے عام طور پر استعمال ہونے والے کلرتی فعل مندرجہ ذیل ہیں:

آپریٹر تفصیل مثال
$avg اوسط حساب کریں {$avg: "$amount"}
$sum مجموعیت {$sum: "$amount"}
$max زیادہ سے زیادہ قیمت {$max: "$amount"}
$min کم سے کم قیمت {$min: "$amount"}
$first گروپ بنانے کے بعد ڈیٹا واپس کریں، پہلا دستاویز کا مواد {$first: "$amount"}
$last گروپ بنانے کے بعد ڈیٹا واپس کریں، آخری دستاویز کا مواد {$last: "$amount"}
$push گروپ بنانے کے بعد ڈیٹا واپس کریں { $push: { ord_date: "$ord_date", amount: "$amount" }
$addToSet گروپ بنانے کے بعد ڈیٹا واپس کریں، $push کی برعکس ہے کیونکہ یہ تکرار کو ہٹا دیتا ہے { $addToSet: "$amount" }

$پش کا مثال

db.orders.aggregate(
   [
     {
       $group:
         {
           _id: "$cust_id",
           all: { $push: { ord_date: "$ord_date", amount: "$amount" } } // ord_date اور amount فیلڈز کی قیمتیں
         }
     }
   ]
)

آؤٹپٹ

{ "_id" : "abc1", "all" : [ { "ord_date" : "2021-04-18 00:00:00", "amount" : 50 }, { "ord_date" : "2021-04-21 00:00:00", "amount" : 25 } ] }
{ "_id" : "xyz1", "all" : [ { "ord_date" : "2021-04-18 00:00:00", "amount" : 100 }, { "ord_date" : "2021-04-20 00:00:00", "amount" : 25 }, { "ord_date" : "2021-04-21 00:00:00", "amount" : 125 } ] }

$addToSet کا مثال

db.orders.aggregate(
   [
     {
       $group:
         {
           _id: "$cust_id",
           all_amount: { $addToSet: "$amount" } // تمام مختلف رقمی قیمتیں واپس کریں
         }
     }
   ]
)

آؤٹپٹ

{ "_id" : "abc1", "all_amount" : [ 25, 50 ] }
{ "_id" : "xyz1", "all_amount" : [ 100, 25, 125 ] }

$سارٹ

$سارٹ مرحلہ عام طور پر آخر میں رکھا جاتا ہے تاکہ کلرٹیٹڈ ڈیٹا کو سارٹ کیا جا سکے۔

فارمیٹ:

{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

وضاحت:

  • ، - سارٹ کرنے والے فیلڈز کے نام، مختلف فیلڈز کا سپورٹ کرتا ہے۔
  • - سارٹ کی سمت، غیرترتیبی کے لئے -1، منسلکتیبی کے لئے 1۔

مثال:

db.orders.aggregate([
                     { $match: { status: "A" } },
                     { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
                     { $sort: { total: -1 } }
                   ])

کلرٹیٹ پیجینیشن

ہم $limit اور $skip آپریٹرز کا استعمال کرکے پیجینیشن کے طریقے سے عمل کرسکتے ہیں۔

مثال:

db.orders.aggregate([
                     { $match: { status: "A" } },
                     { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
                     { $sort: { total: -1 } },
					 { $limit: 5 }, // واپس آنے والے ریکارڈز کی تعداد محدود کرتا ہے، پیجینیشن میں صفحے کا سائز کے مترادف ہے۔
					 { $skip: 1 } // کچھ ریکارڈز کو چھوڑ دیتا ہے، ایسا ہی SQL میں آفسیٹ کے مترادف ہے۔
                   ])