MongoDB एग्रीगेशन का उपयोग करके सबडॉक्यूमेंट फील्ड द्वारा सॉर्ट करना
एम्बेडेड डॉक्यूमेंट्स के ऐरे के अंदर एक फील्ड द्वारा डॉक्यूमेंट्स को सॉर्ट करने के लिए, ऐरे को अनविंड करने, वांछित सबडॉक्यूमेंट्स को फ़िल्टर करने, और फिर सॉर्ट करने के लिए एग्रीगेशन पाइपलाइन का उपयोग करें।
नमूना डेटा बनाना
> db.sortBySubDocumentsDemo.insertOne(
{
"StudentName": "Chris",
"StudentDetails": [
{ "Age":21, "StudentScore":91 },
{ "Age":22, "StudentScore":99 },
{ "Age":21, "StudentScore":93 }
]
}
);
{ "acknowledged" : true, "insertedId" : ObjectId("5cd57e297924bb85b3f48942") }
> db.sortBySubDocumentsDemo.insertOne(
{
"StudentName": "Robert",
"StudentDetails": [
{ "Age":24, "StudentScore":78 },
{ "Age":21, "StudentScore":86 },
{ "Age":23, "StudentScore":45 }
]
}
);
{ "acknowledged" : true, "insertedId" : ObjectId("5cd57e4c7924bb85b3f48943") }
सभी डॉक्यूमेंट्स देखना
> db.sortBySubDocumentsDemo.find().pretty();
आउटपुट:
{ "_id" : ObjectId("5cd57e297924bb85b3f48942"), "StudentName" : "Chris", "StudentDetails" : [ { "Age" : 21, "StudentScore" : 91 }, { "Age" : 22, "StudentScore" : 99 }, { "Age" : 21, "StudentScore" : 93 } ] }
{ "_id" : ObjectId("5cd57e4c7924bb85b3f48943"), "StudentName" : "Robert", "StudentDetails" : [ { "Age" : 24, "StudentScore" : 78 }, { "Age" : 21, "StudentScore" : 86 }, { "Age" : 23, "StudentScore" : 45 } ] }
उम्र 21 वाले सबडॉक्यूमेंट्स द्वारा सॉर्ट करना
> db.sortBySubDocumentsDemo.aggregate([
{ $match: { 'StudentDetails.Age': 21 } },
{ $unwind: '$StudentDetails' },
{ $match: { 'StudentDetails.Age': 21 } },
{ $project: { _id: 0, "StudentName": 1, 'StudentDetails.StudentScore': 1 } },
{ $sort: { 'StudentDetails.StudentScore': 1 } },
{ $limit: 5 }
]);
आउटपुट:
{ "StudentName" : "Robert", "StudentDetails" : { "StudentScore" : 86 } }
{ "StudentName" : "Chris", "StudentDetails" : { "StudentScore" : 91 } }
{ "StudentName" : "Chris", "StudentDetails" : { "StudentScore" : 93 } }
पाइपलाइन व्याख्या
$match- केवल उन डॉक्यूमेंट्स को फ़िल्टर करता है जहां कम से कम एक सबडॉक्यूमेंट में Age=21 है।$unwind- StudentDetails ऐरे को डी-कंस्ट्रक्ट करता है, प्रत्येक सबडॉक्यूमेंट के लिए अलग डॉक्यूमेंट आउटपुट करता है।$match- फिर से Age=21 वाले केवल सबडॉक्यूमेंट्स को फ़िल्टर करता है।$project- केवल StudentName और StudentScore आउटपुट करता है।$sort- StudentScore द्वारा आरोही क्रम में सॉर्ट करता है (1 = आरोही, -1 = अवरोही)।$limit- परिणामों को 5 डॉक्यूमेंट्स तक सीमित करता है।
मुख्य बिंदु
- सबडॉक्यूमेंट फील्ड्स द्वारा सॉर्ट करने के लिए
$unwindआवश्यक है। - प्रारंभिक
$match(अनविंड से पहले) इंडेक्स का उपयोग कर सकता है और प्रोसेस किए गए डॉक्यूमेंट्स को कम करता है। - दूसरा
$match(अनविंड के बाद) केवल प्रासंगिक सबडॉक्यूमेंट्स को फ़िल्टर करता है। - बड़े ऐरे के लिए प्रदर्शन पर विचार करें - अनविंड डॉक्यूमेंट काउंट को गुणा करता है।