MongoDB एग्रीगेशन के साथ स्टेटस के आधार पर डॉक्यूमेंट्स ग्रुप करना
इसके लिए MongoDB में aggregate() का उपयोग कर सकते हैं।
कलेक्शन बनाना
> db.demo149.insertOne({"Status":40});
{ "acknowledged": true, "insertedId": ObjectId("5e350386fdf09dd6d08539c4") }
> db.demo149.insertOne({"Status":40});
{ "acknowledged": true, "insertedId": ObjectId("5e350388fdf09dd6d08539c5") }
> db.demo149.insertOne({"Status":50});
{ "acknowledged": true, "insertedId": ObjectId("5e35038afdf09dd6d08539c6") }
सभी डॉक्यूमेंट्स
> db.demo149.find();
ग्रुप बाय एग्रीगेशन क्वेरी
> db.demo149.aggregate([ { "$group": { "_id": null, "done": { "$push": { "$cond": [ { "$eq": ["$Status", 40] }, { "_id": "$_id", "Status": "$Status" }, false ] } }, "notdone": { "$push": { "$cond": [ { "$eq": ["$Status", 50] }, { "_id": "$_id", "Status": "$Status" }, false ] } } } }, { "$project": { "_id": 0, "done": { "$setDifference": ["$done", [false]] }, "notdone": { "$setDifference": ["$notdone", [false]] } } } ]);परिणाम
व्याख्या
- $group (_id: null): सभी डॉक्यूमेंट्स को एक ग्रुप में रखता है
- $push + $cond: सशर्त रूप से ऐरे में ऑब्जेक्ट्स जोड़ता है
- done: Status 40 वाले डॉक्यूमेंट्स जोड़ता है, अन्यथा false
- notdone: Status 50 वाले डॉक्यूमेंट्स जोड़ता है, अन्यथा false
- $project + $setDifference: false मानों को ऐरे से हटाता है
- $setDifference: ["$done", [false]] - done ऐरे से false हटाता है
सरल विकल्प (MongoDB 3.4+)
या बस दो अलग क्वेरी चलाएं यदि प्रदर्शन महत्वपूर्ण है।