इस अध्याय में, MongoDB के सांख्यिकीय विश्लेषण का विस्तृत विवरण प्रस्तुत किया गया है, जिसे मुख्य रूप से एग्रीगेशन पाइपलाइन के माध्यम से प्राप्त किया जाता है। यह SQL में "group by" विधान के समान है। MongoDB शैल में, सांख्यिकीय विश्लेषण को db.collection.aggregate()
कार्य का उपयोग करके लागू किया जाता है।
पूर्वाशिक ट्यूटोरियल
सामान्य कदम
- लक्ष्य डेटा को फ़िल्टर करने के लिए
$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 } // निश्चित संख्या की रिकॉर्ड्स छोड़ता है, एसक्यूएल के ऑफसेट की तरह।
])