MongoDB एग्रीगेशन के साथ सबडॉक्यूमेंट्स सॉर्ट करना
नेस्टेड ऐरे में सबडॉक्यूमेंट्स को उनकी गणना की गई संपत्ति के आधार पर सॉर्ट करें।
कलेक्शन बनाना
> db.demo136.insertOne(
{
"Name": "Chris",
"Details": [
{
"Id": "101",
"EmployeeName": "Mike",
"EmployeeDetails": [
{ "EmpId": 1001, "Salary": 1000 },
{ "EmpId": 1002, "Salary": 2000 }
]
},
{
"Id": "102",
"EmployeeName": "David",
"EmployeeDetails": [
{ "EmpId": 1004, "Salary": 4000 },
{ "EmpId": 1005, "Salary": 5000 }
]
}
]
}
);
{ "acknowledged": true, "insertedId": ObjectId("5e31b15cfdf09dd6d085399f") }
सभी डॉक्यूमेंट्स
> db.demo136.find();
{ "_id": ObjectId("5e31b15cfdf09dd6d085399f"), "Name": "Chris", "Details": [ { "Id": "101", "EmployeeName": "Mike", "EmployeeDetails": [ { "EmpId": 1001, "Salary": 1000 }, { "EmpId": 1002, "Salary": 2000 } ] }, { "Id": "102", "EmployeeName": "David", "EmployeeDetails": [ { "EmpId": 1004, "Salary": 4000 }, { "EmpId": 1005, "Salary": 5000 } ] } ] }
सबडॉक्यूमेंट्स सॉर्ट करने की एग्रीगेशन क्वेरी
> db.demo136.aggregate([
{ $unwind: "$Details" },
{
$project: {
Name: 1,
Details: 1,
SalaryTotal: { $sum: "$Details.EmployeeDetails.Salary" }
}
},
{ $sort: { SalaryTotal: -1 } },
{
$group: {
_id: "$_id",
Name: { $first: "$Name" },
Details: { $push: "$Details" }
}
}
]).pretty()
परिणाम
{ "_id": ObjectId("5e31b15cfdf09dd6d085399f"), "Name": "Chris", "Details": [ { "Id": "102", "EmployeeName": "David", "EmployeeDetails": [ { "EmpId": 1004, "Salary": 4000 }, { "EmpId": 1005, "Salary": 5000 } ] }, { "Id": "101", "EmployeeName": "Mike", "EmployeeDetails": [ { "EmpId": 1001, "Salary": 1000 }, { "EmpId": 1002, "Salary": 2000 } ] } ] }
व्याख्या
- $unwind: "$Details": Details ऐरे को अलग-अलग डॉक्यूमेंट्स में फैलाता है
- $project: SalaryTotal की गणना करता है ($sum: "$Details.EmployeeDetails.Salary" ऐरे के सभी वेतन जोड़ता है)
- Mike: 1000 + 2000 = 3000
- David: 4000 + 5000 = 9000
- $sort: {SalaryTotal: -1}: SalaryTotal के अवरोही क्रम में सॉर्ट करता है (David पहले)
- $group: मूल _id द्वारा पुनः ग्रुप करता है, सॉर्ट किए गए क्रम में Details ऐरे को पुनर्निर्मित करता है
परिणाम
Details ऐरे अब सॉर्ट है: David (कुल 9000) पहले, फिर Mike (कुल 3000)।