MongoDB एग्रीगेशन में $project, $unwind, $group का उपयोग करके $group फेज ऑप्टिमाइज़ करना
MongoDB एग्रीगेशन में $group फेज के प्रदर्शन को बेहतर बनाने के लिए, ग्रुपिंग से पहले $project और $unwind का उपयोग करके केवल आवश्यक फील्ड्स पास करें और ऐरे को फ्लैट करें।
उदाहरण: संग्रह और दस्तावेज़ बनाना
> db.demo423.insertOne({"Information":[101,110,87,110,98,115,101,115,89,115]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e73a60e9822da45b30346e6") }
दस्तावेज़ देखना
> db.demo423.find();
आउटपुट:
{ "_id" : ObjectId("5e73a60e9822da45b30346e6"), "Information" : [ 101, 110, 87, 110, 98, 115, 101, 115, 89, 115 ] }
आवृत्ति गिनती के लिए ऑप्टिमाइज़्ड एग्रीगेशन (टॉप 2)
> db.demo423.aggregate([
{ $project: {_id: 0, 'Information': 1} },
{ $unwind: '$Information' },
{ $group: {_id: '$Information', frequency: {$sum: 1}} },
{ $sort: {frequency: -1} },
{ $limit: 2 }
])
आउटपुट:
{ "_id" : 115, "frequency" : 3 }
{ "_id" : 110, "frequency" : 2 }
चरण-दर-चरण व्याख्या:
$project: {_id: 0, 'Information': 1}- केवल आवश्यक फील्ड पास करें, _id हटाएं (डेटा ट्रांसफर कम)$unwind: '$Information'- ऐरे के प्रत्येक एलिमेंट के लिए अलग दस्तावेज़ बनाएं$group: {_id: '$Information', frequency: {$sum: 1}}- मान द्वारा ग्रुप करें और गिनें$sort: {frequency: -1}- आवृत्ति के अवरोही क्रम में सॉर्ट$limit: 2- शीर्ष 2 परिणाम
प्रदर्शन अनुकूलन टिप्स:
- जल्दी $project: अनावश्यक फील्ड्स जल्दी हटाएं
- इंडेक्स उपयोग: $match को पाइपलाइन में पहले रखें ताकि इंडेक्स उपयोग हो सके
- $limit जल्दी: यदि संभव हो तो $sort से पहले $limit (लेकिन यहां सॉर्ट जरूरी है)
- allowDiskUse: true - बड़े डेटासेट के लिए डिस्क उपयोग की अनुमति
- शार्डेड कलेक्शन: $group से पहले $sortByCount उपयोग करें
विकल्प: $sortByCount (MongoDB 3.4+)
db.demo423.aggregate([
{$unwind: "$Information"},
{$sortByCount: "$Information"},
{$limit: 2}
])
$sortByCount $group + $sort का संक्षिप्त रूप है।