MongoDB में एक ही एग्रीगेशन पाइपलाइन में ग्रुपिंग और सॉर्टिंग करने के लिए $group के बाद $sort स्टेज का उपयोग करें।
उदाहरण
उत्पाद और कीमत वाले दस्तावेज़ बनाएं:
> db.sortAndGroupDemo.insertOne({Price: 40, Product: 10});
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bc78f00858fb12e907") }
> db.sortAndGroupDemo.insertOne({Price: 100, Product: 10});
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bc78f00858fb12e908") }
> db.sortAndGroupDemo.insertOne({Price: 90, Product: 20});
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bc78f00858fb12e909") }
> db.sortAndGroupDemo.insertOne({Price: 200, Product: 10});
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bc78f00858fb12e90a") }
> db.sortAndGroupDemo.insertOne({Price: 70, Product: 20});
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bc78f00858fb12e90b") }
> db.sortAndGroupDemo.insertOne({Price: 70, Product: 30});
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bd78f00858fb12e90c") }
सभी दस्तावेज़ देखें:
> db.sortAndGroupDemo.find().pretty();
{ "_id" : ObjectId("5ce8f2bc78f00858fb12e907"), "Price" : 40, "Product" : 10 }
{ "_id" : ObjectId("5ce8f2bc78f00858fb12e908"), "Price" : 100, "Product" : 10 }
{ "_id" : ObjectId("5ce8f2bc78f00858fb12e909"), "Price" : 90, "Product" : 20 }
{ "_id" : ObjectId("5ce8f2bc78f00858fb12e90a"), "Price" : 200, "Product" : 10 }
{ "_id" : ObjectId("5ce8f2bc78f00858fb12e90b"), "Price" : 70, "Product" : 20 }
{ "_id" : ObjectId("5ce8f2bd78f00858fb12e90c"), "Price" : 70, "Product" : 30 }
Product द्वारा ग्रुप करके कीमत आरोही क्रम में सॉर्ट
> db.sortAndGroupDemo.aggregate([
{$group: {_id: "$Product"}},
{$sort: {Price: 1}},
{$project: {_id: 1}}
]);
आउटपुट:
{ "_id" : 30 }
{ "_id" : 20 }
{ "_id" : 10 }
महत्वपूर्ण समस्या: इस क्वेरी में $sort के समय Price फील्ड उपलब्ध नहीं है क्योंकि $group में केवल _id रखा गया है।
सही तरीका: ग्रुपिंग में एग्रीगेशन शामिल करें
db.sortAndGroupDemo.aggregate([
{$group: {
_id: "$Product",
minPrice: {$min: "$Price"},
maxPrice: {$max: "$Price"},
avgPrice: {$avg: "$Price"}
}},
{$sort: {minPrice: 1}},
{$project: {_id: 1, minPrice: 1, maxPrice: 1, avgPrice: 1}}
]);
संभावित आउटपुट:
{ "_id" : 30, "minPrice" : 70, "maxPrice" : 70, "avgPrice" : 70 }
{ "_id" : 20, "minPrice" : 70, "maxPrice" : 90, "avgPrice" : 80 }
{ "_id" : 10, "minPrice" : 40, "maxPrice" : 200, "avgPrice" : 110 }
पाइपलाइन क्रम:
$match- फिल्टर (पहले करें, दस्तावेज़ कम करें)$group- ग्रुपिंग और एग्रीगेशन$sort- ग्रुप परिणाम सॉर्ट करें$project- आउटपुट फॉर्मेट$limit/$skip- पेजिनेशन
नोट: $sort से पहले $group करें, अन्यथा सॉर्टिंग व्यक्तिगत दस्तावेज़ों पर होगी न कि ग्रुप पर।