MongoDB एग्रीगेशन में ऐरे सॉर्टिंग और फुल प्रोजेक्शन
एम्बेडेड ऐरे को सॉर्ट करते समय मूल दस्तावेज़ संरचना को बनाए रखने के लिए $unwind, $sort, $group, और $project का संयोजन उपयोग करें।
सैंपल डेटा बनाना
> db.demo252.insertOne({
"Values" : [
{ "v1" : 20, "v2" : 30 },
{ "v1" : 20, "v2" : 20 },
{ "v1" : 10, "v2" : 7 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e46c2761627c0c63e7dba78") }
दस्तावेज़ देखना (अनसॉर्टेड)
> db.demo252.find();
आउटपुट:
एग्रीगेशन पाइपलाइन: v2 द्वारा सॉर्ट, फिर v1 द्वारा, सभी फ़ील्ड्स रखें
> db.demo252.aggregate([ { "$unwind": "$Values" }, { "$sort": { "Values.v2": 1, "Values.v1": 1 } }, { "$group": { "_id": { "_id": "$_id" }, "st": { "$push": "$Values" } }}, { "$project": { "_id": "$_id._id", "Values": "$st" }} ]);आउटपुट (सॉर्टेड ऐरे, सभी फ़ील्ड्स संरक्षित):
चरण-दर-चरण स्पष्टीकरण
$unwind: Values ऐरे को फ्लैट करता है, प्रत्येक ऑब्जेक्ट के लिए एक दस्तावेज़$sort: पहले v2 द्वारा आरोही, फिर v1 द्वारा आरोही सॉर्ट करता है$group: मूल _id द्वारा पुनः ग्रुप करता है, सॉर्टेड ऑब्जेक्ट्स कोstऐरे में पुश करता है$project: आउटपुट संरचना को पुनर्गठित करता है (_id को फ्लैट करता है, Values को पुनर्स्थापित करता है)सरल विकल्प: MongoDB 3.6+ में $sortArray
> db.demo252.aggregate([ { $project: { Values: { $sortArray: { input: "$Values", sortBy: { v2: 1, v1: 1 } } } }} ]);नोट
मूल उदाहरण में
$groupका _id ऑब्जेक्ट{ "_id": "$_id" }अनावश्यक रूप से नेस्टेड है। सरल_id: "$_id"पर्याप्त होता।