इस अध्याय में, MongoDB के सांख्यिकीय विश्लेषण का विस्तृत विवरण प्रस्तुत किया गया है, जिसे मुख्य रूप से एग्रीगेशन पाइपलाइन के माध्यम से प्राप्त किया जाता है। यह SQL में "group by" विधान के समान है। MongoDB शैल में, सांख्यिकीय विश्लेषण को db.collection.aggregate() कार्य का उपयोग करके लागू किया जाता है।

पूर्वाशिक ट्यूटोरियल

MongoDB एग्रीगेशन पाइपलाइन

सामान्य कदम

  • लक्ष्य डेटा को फ़िल्टर करने के लिए $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 }

एग्रीगेट कार्य

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 चरण

स्वरूप:

{ $match: { <query> } }

स्पष्टीकरण:

  • <query> MongoDB क्वेरी शर्तें

क्वेरी शर्तें सेट करने के लिए प्रयोग किया जाता है। अगर $match को नजरअंदाज किया जाता है, तो इससे सभी डेटा क्वेरी करने का अर्थ है।

सुझाव: अगर आप MongoDB क्वेरी वाक्य संरचना को जानते नहीं हैं, तो कृपया पिछले अध्यायों का संदर्भ लें।

$group चरण

SQL में group by वाक्य के समान, इसे डेटा को समूहित करने और फिर समूहित डेटा पर एक श्रृंखला सांख्यिकीय गणनाएँ करने के लिए प्रयोग किया जाता है।

$group का मूल उपयोग

संरचना:

{
  $group:
    {
      _id: <expression>, // समूहण शर्त, उदाहरण के लिए: किस फ़ील्ड के अनुसार समूहण
      <field1>: { <accumulator1> : <expression1> },  // सांख्यिकीय संग्रह ऑपरेशन, आप N संग्रह ऑपरेशन जोड़ सकते हैं
      ...
    }
 }

स्पष्टीकरण:

  • - विशेष रूप से नामित सांख्यिकीय संकेतक, कुल N प्रायोगिक संकेतक हो सकते हैं
  • - संग्रह कार्य, सामान्यत: SQL के संख्या, औसत और अन्य संग्रह कार्यों के समान, फर्क यह है कि MongoDB के संग्रह कार्यों को $ के प्रारंभ मान रूप में नामित किया जाता है, उदाहरण के लिए: $sum, $avg
  • - संग्रह कार्य का पैरामीटर, सामान्यत: गणना करने वाले फ़ील्ड का मान, दस्तावेज़ के फ़ील्ड को "$फ़ील्ड नाम" के प्रारूप में संदर्भित करते हैं

उदाहरण:

db.orders.aggregate([
                     {
					 	$group: { 
							_id: "$cust_id",
							total: { $sum: "$amount" }, // पहले संगणन संकेतक कुल को जोड़ें, $sum संगणन ऑपरेटर का उपयोग करें
							amount_avg: {$avg: "$amount"}  // दूसरे संगणन संकेतक औसत को जोड़ें, $avg औसत गणना ऑपरेटर का उपयोग करें
						} 
					}
               ])

परिणाम:

{ "_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

$group एग्रीगेशन फंक्शन्स

$group के लिए सामान्य रूप से प्रयोग होने वाले एग्रीगेशन फंक्शन्स निम्नलिखित होते हैं:

ऑपरेटर विवरण उदाहरण
$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" }

$push का उदाहरण

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:

$sort स्टेज सामान्यत: एग्रीगेटेड डेटा को क्रमबद्ध करने के लिए अंत में रखा जाता है।

फ़ॉर्मेट:

{ $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 } // निश्चित संख्या की रिकॉर्ड्स छोड़ता है, एसक्यूएल के ऑफसेट की तरह।
                   ])