MongoDB एग्रीगेशन में नेस्टेड ऐरे एलिमेंट्स द्वारा सॉर्टिंग
जब दस्तावेज़ों में ऐरे ऑफ ऑब्जेक्ट्स होता है, तो ऐरे एलिमेंट्स के फ़ील्ड्स द्वारा दस्तावेज़ों को सॉर्ट करने के लिए $unwind, $sort, और $group का उपयोग करें।
सैंपल डेटा बनाना
> db.demo245.insertOne({
_id: 101,
details: [
{ "DueDate": new ISODate("2019-01-10"), "Value": 45 },
{ "DueDate": new ISODate("2019-11-10"), "Value": 34 }
]
});
> db.demo245.insertOne({
_id: 102,
details: [
{ "DueDate": new ISODate("2019-12-11"), "Value": 29 },
{ "DueDate": new ISODate("2019-03-10"), "Value": 78 }
]
});
दस्तावेज़ देखना
> db.demo245.find();
आउटपुट (नोट: पहले दस्तावेज़ में टाइपो "deatils" है):
एग्रीगेशन: Value द्वारा डिसेंडिंग सॉर्ट करके ऐरे को पुनर्व्यवस्थित करें
> db.demo245.aggregate([ { "$unwind": "$details" }, { "$sort": { "_id": 1, "details.Value": -1 } }, { "$group": { "_id": "$_id", "details": { "$push": "$details" } }}, { "$sort": { "details.Value": -1 } } ]);आउटपुट (प्रत्येक दस्तावेज़ का ऐरे Value द्वारा डिसेंडिंग सॉर्टेड, फिर दस्तावेज़ भी Value द्वारा सॉर्टेड):
नोट: टाइपो और परिणाम
- पहले दस्तावेज़ में फ़ील्ड नाम
deatils(टाइपो) है न किdetails - $unwind "$details" केवल दूसरे दस्तावेज़ (102) को प्रोसेस करता है क्योंकि पहले में "details" फ़ील्ड नहीं है
- यही कारण है कि आउटपुट में केवल _id: 102 है
सही डेटा के लिए संशोधित क्वेरी
> // दोनों फ़ील्ड नामों को हैंडल करने के लिए
> db.demo245.aggregate([
{ $project: { details: { $concatArrays: ["$details", "$deatils"] } } },
{ $unwind: "$details" },
{ $sort: { "details.Value": -1 } },
{ $group: { _id: "$_id", details: { $push: "$details" } } }
]);
MongoDB 5.2+ में $sortArray
> db.demo245.aggregate([
{ $project: {
details: { $sortArray: { input: { $concatArrays: ["$details", "$deatils"] }, sortBy: { Value: -1 } } }
}}
]);