MongoDB में दस्तावेज़ों को सरणी फील्ड की लंबाई के आधार पर सॉर्ट करने के लिए, एग्रीगेशन पाइपलाइन का उपयोग करें: $unwind → $group साथ $sum → $sort।
उदाहरण: छात्र सूची वाले दस्तावेज़
> db.demo33.insertOne({"ListOfStudent":["Chris","Bob"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e17556ccfb11e5c34d898ca") }
> db.demo33.insertOne({"ListOfStudent":["David","Adam","Mike"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e17557acfb11e5c34d898cb") }
> db.demo33.insertOne({"ListOfStudent":["Carol","Sam","John","Robert"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e1755a3cfb11e5c34d898cc") }
दस्तावेज़ देखना
> db.demo33.find();
आउटपुट: 2, 3, और 4 तत्वों वाली सरणी के साथ तीन दस्तावेज़।
एग्रीगेशन: सरणी लंबाई द्वारा सॉर्ट (अवरोही)
> db.demo33.aggregate(
{ $unwind: "$ListOfStudent" },
{ $group: { _id: '$_id', ct: { $sum: 1 } } },
{ $sort: { ct: -1 } }
);
परिणाम
{ "_id" : ObjectId("5e1755a3cfb11e5c34d898cc"), "ct" : 4 }
{ "_id" : ObjectId("5e17557acfb11e5c34d898cb"), "ct" : 3 }
{ "_id" : ObjectId("5e17556ccfb11e5c34d898ca"), "ct" : 2 }
चरण व्याख्या
- $unwind: प्रत्येक सरणी तत्व के लिए एक दस्तावेज़ बनाता है।
- $group + $sum: मूल
_idद्वारा पुनः समूहित करता है और तत्वों की गणना करता है (ct)। - $sort: गणना (
ct: -1अवरोही के लिए) द्वारा सॉर्ट करता है।
बेहतर विकल्प: $size (MongoDB 3.2+)
$unwind/$group के बजाय, सीधे $size का उपयोग करें:
> db.demo33.aggregate([
{ $project: { _id: 1, ListOfStudent: 1, len: { $size: "$ListOfStudent" } } },
{ $sort: { len: -1 } }
]);
यह अधिक कुशल है और सरणी संरचना को संरक्षित करता है।
नोट
$sizeकेवल प्रोजेक्शन/मैच में काम करता है, सीधे$sortमें नहीं; इसलिए प्रोजेक्ट चरण।- बहुत बड़ी सरणी के लिए, प्री-कम्प्यूटेड लंबाई फील्ड को इंडेक्स करने पर विचार करें।