MongoDB
एकत्रीकरण
खोज…
परिचय
Aggregations
संचालन डेटा रिकॉर्ड की प्रक्रिया करता है और गणना किए गए परिणाम लौटाता है। एक साथ कई दस्तावेजों से एकत्रीकरण संचालन समूह मूल्य, और एकल परिणाम वापस करने के लिए समूहीकृत डेटा पर कई प्रकार के संचालन कर सकते हैं। MongoDB एकत्रीकरण करने के लिए तीन तरीके प्रदान करता है: एकत्रीकरण पाइपलाइन, मानचित्र-कम फ़ंक्शन और एकल उद्देश्य एकत्रीकरण विधियाँ।
मैंगो मैनुअल से https://docs.mongodb.com/manual/aggregation/
वाक्य - विन्यास
- db.collection.aggregate (पाइपलाइन, विकल्प)
पैरामीटर
पैरामीटर | विवरण |
---|---|
पाइपलाइन | सरणी (डेटा एकत्रीकरण संचालन या चरणों का एक क्रम) |
विकल्प | दस्तावेज़ (वैकल्पिक, केवल तभी उपलब्ध है जब पाइपलाइन एक सरणी के रूप में मौजूद है) |
टिप्पणियों
एसक्यूएल की कार्यक्षमता GROUP BY
आम GROUP BY
को प्राप्त करने के लिए मोंगोबीडी में एकत्रीकरण ढांचे का उपयोग किया जाता है।
हर उदाहरण के लिए transactions
नाम के संग्रह में निम्नलिखित सम्मिलन पर विचार करें।
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
गिनती
आपको डेबिट और क्रेडिट लेनदेन की संख्या कैसे मिलती है? इसे करने का एक तरीका नीचे के रूप में count()
फ़ंक्शन का उपयोग करना है।
> db.transactions.count({cr_dr : "D"});
या
> db.transactions.find({cr_dr : "D"}).length();
लेकिन क्या होगा अगर आपको cr_dr
upfront के संभावित मूल्यों का पता नहीं है। यहां एग्रीगेशन फ्रेमवर्क खेलने के लिए आता है। नीचे दिए गए समग्र क्वेरी को देखें।
> db.transactions.aggregate(
[
{
$group : {
_id : '$cr_dr', // group by type of transaction
// Add 1 for each document to the count for this type of transaction
count : {$sum : 1}
}
}
]
);
और परिणाम है
{
"_id" : "C",
"count" : 3
}
{
"_id" : "D",
"count" : 5
}
योग
amount
का योग कैसे प्राप्त करें? नीचे दी गई समग्र क्वेरी देखें।
> db.transactions.aggregate(
[
{
$group : {
_id : '$cr_dr',
count : {$sum : 1}, //counts the number
totalAmount : {$sum : '$amount'} //sums the amount
}
}
]
);
और परिणाम है
{
"_id" : "C",
"count" : 3.0,
"totalAmount" : 120.0
}
{
"_id" : "D",
"count" : 5.0,
"totalAmount" : 410.0
}
एक और संस्करण है जो amount
और fee
।
> db.transactions.aggregate(
[
{
$group : {
_id : '$cr_dr',
count : {$sum : 1},
totalAmount : {$sum : { $sum : ['$amount', '$fee']}}
}
}
]
);
और परिणाम है
{
"_id" : "C",
"count" : 3.0,
"totalAmount" : 128.0
}
{
"_id" : "D",
"count" : 5.0,
"totalAmount" : 422.0
}
औसत
डेबिट और क्रेडिट लेनदेन की औसत राशि कैसे प्राप्त करें?
> db.transactions.aggregate(
[
{
$group : {
_id : '$cr_dr', // group by type of transaction (debit or credit)
count : {$sum : 1}, // number of transaction for each type
totalAmount : {$sum : { $sum : ['$amount', '$fee']}}, // sum
averageAmount : {$avg : { $sum : ['$amount', '$fee']}} // average
}
}
]
)
परिणाम है
{
"_id" : "C", // Amounts for credit transactions
"count" : 3.0,
"totalAmount" : 128.0,
"averageAmount" : 40.0
}
{
"_id" : "D", // Amounts for debit transactions
"count" : 5.0,
"totalAmount" : 422.0,
"averageAmount" : 82.0
}
सरणियों के साथ संचालन।
जब आप सरणियों में डेटा प्रविष्टियों के साथ काम करना चाहते हैं, तो आपको पहले सरणी को खोलना होगा। ऐरेस ऑपरेशन ऐरे में प्रत्येक प्रविष्टि के लिए एक दस्तावेज बनाता है। जब आपके पास बड़े एरे के साथ बहुत सारे दस्तावेज हैं तो आप दस्तावेजों की संख्या में विस्फोट देखेंगे।
{ "_id" : 1, "item" : "myItem1", sizes: [ "S", "M", "L"] }
{ "_id" : 2, "item" : "myItem2", sizes: [ "XS", "M", "XL"] }
db.inventory.aggregate( [ { $unwind : "$sizes" }] )
एक महत्वपूर्ण सूचना यह है कि जब किसी दस्तावेज़ में सरणी नहीं होती है तो वह खो जाएगा। मूंगो 3.2 से और ऊपर एक खोल विकल्प है "preserveNullAndEmptyArrays" जोड़ा गया। यह विकल्प सुनिश्चित करता है कि सरणी गायब होने पर दस्तावेज़ संरक्षित है।
{ "_id" : 1, "item" : "myItem1", sizes: [ "S", "M", "L"] }
{ "_id" : 2, "item" : "myItem2", sizes: [ "XS", "M", "XL"] }
{ "_id" : 3, "item" : "myItem3" }
db.inventory.aggregate( [ { $unwind : { path: "$sizes", includeArrayIndex: "arrayIndex" } }] )
मैच
उन सभी विभागों को प्राप्त करने के लिए एक प्रश्न कैसे लिखें जहां कर्मचारियों की औसत आयु $ 700 से कम या $ 35 के बराबर या उससे अधिक है?
इसके लिए हमें उन कर्मचारियों से मेल खाने के लिए एक प्रश्न लिखना होगा, जिनका वेतन $ 70000 से कम या बराबर है। फिर विभाग द्वारा कर्मचारियों को समूहीकृत करने के लिए समग्र चरण जोड़ें। इसके बाद एक फ़ील्ड के साथ एक संचायक जोड़ें जैसे कि एवरेज_जेज का नाम $ avg संचायक का उपयोग कर प्रति विभाग औसत आयु ज्ञात करने के लिए और मौजूदा $ मैच और $ समूह एग्रीगेट के साथ एक और $ मैच एग्रीगेट जोड़ते हैं ताकि हम केवल एवरेज के साथ परिणाम प्राप्त कर रहे हैं। 35 की तुलना में या उससे अधिक।
db.employees.aggregate([
{"$match": {"salary": {"$lte": 70000}}},
{"$group": {"_id": "$dept",
"average_age": {"$avg": "$age"}
}
},
{"$match": {"average_age": {"$gte": 35}}}
])
परिणाम है:
{
"_id": "IT",
"average_age": 31
}
{
"_id": "Customer Service",
"average_age": 34.5
}
{
"_id": "Finance",
"average_age": 32.5
}
उन डॉक्स को निकालें, जिनके पास डुप्लिकेट फ़ील्ड डुप्लिकेट है (संग्रह)
ध्यान दें कि allowDiskUse: सच्चा विकल्प वैकल्पिक है, लेकिन यह मेमोरी के मुद्दों को कम करने में मदद करेगा क्योंकि यह एकत्रीकरण एक मेमोरी सघन ऑपरेशन हो सकता है यदि आपका संग्रह आकार बड़ा है - तो मैं हमेशा इसका उपयोग करने की सलाह देता हूं।
var duplicates = [];
db.transactions.aggregate([
{ $group: {
_id: { cr_dr: "$cr_dr"},
dups: { "$addToSet": "$_id" },
count: { "$sum": 1 }
}
},
{ $match: {
count: { "$gt": 1 }
}}
],allowDiskUse: true}
)
.result
.forEach(function(doc) {
doc.dups.shift();
doc.dups.forEach( function(dupId){
duplicates.push(dupId);
}
)
})
// printjson(duplicates);
// Remove all duplicates in one go
db.transactions.remove({_id:{$in:duplicates}})