MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

मोंगोडब एकत्रीकरण ढांचे में केस-स्टेटमेंट निष्पादित करना

एग्रीगेशन फ्रेमवर्क में "केस" SQL स्टेटमेंट से क्या मेल खाता है, $cond ऑपरेटर है (मैन्युअल देखें)। $cond स्टेटमेंट को "कब-तब" और "अन्य" का अनुकरण करने के लिए नेस्ट किया जा सकता है, लेकिन मैंने एक और तरीका चुना है, क्योंकि इसे पढ़ना आसान है (और जेनरेट करना, नीचे देखें):मैं लिखने के लिए $concat ऑपरेटर का उपयोग करूंगा श्रेणी स्ट्रिंग, जो तब समूहीकरण कुंजी के रूप में कार्य करती है।

तो दिए गए संग्रह के लिए:

db.xx.find()
{ "_id" : ObjectId("514919fb23700b41723f94dc"), "name" : "A", "timespent" : 100 }
{ "_id" : ObjectId("514919fb23700b41723f94dd"), "name" : "B", "timespent" : 200 }
{ "_id" : ObjectId("514919fb23700b41723f94de"), "name" : "C", "timespent" : 300 }
{ "_id" : ObjectId("514919fb23700b41723f94df"), "name" : "D", "timespent" : 400 }
{ "_id" : ObjectId("514919fb23700b41723f94e0"), "name" : "E", "timespent" : 500 }

कुल (हार्डकोडेड) इस तरह दिखता है:

db.xx.aggregate([
  { $project: {
    "_id": 0,
    "range": {
      $concat: [{
        $cond: [ { $lte: ["$timespent", 250] }, "range 0-250", "" ]
      }, {
        $cond: [ { $and: [
          { $gte: ["$timespent", 251] }, 
          { $lt:  ["$timespent", 450] } 
        ] }, "range 251-450", "" ]
      }, {
        $cond: [ { $and: [
          { $gte: ["$timespent", 451] }, 
          { $lt:  ["$timespent", 650] } 
        ] }, "range 450-650", "" ]
      }]
    }
  }},
  { $group: { _id: "$range", count: { $sum: 1 } } },
  { $sort: { "_id": 1 } },
]);

और परिणाम है:

{
    "result" : [
        {
            "_id" : "range 0-250",
            "count" : 2
        },
        {
            "_id" : "range 251-450",
            "count" : 2
        },
        {
            "_id" : "range 450-650",
            "count" : 1
        }
    ],
    "ok" : 1
}

एग्रीगेट कमांड जनरेट करने के लिए, आपको "रेंज" प्रोजेक्शन को JSON ऑब्जेक्ट के रूप में बनाना होगा (या आप एक स्ट्रिंग जेनरेट कर सकते हैं और फिर JSON.parse(string) का उपयोग कर सकते हैं)

जनरेटर इस तरह दिखता है:

var ranges = [ 0, 250, 450, 650 ];
var rangeProj = {
  "$concat": []
};

for (i = 1; i < ranges.length; i++) {
  rangeProj.$concat.push({
    $cond: {
      if: {
        $and: [{
          $gte: [ "$timespent", ranges[i-1] ]
        }, {
          $lt: [ "$timespent", ranges[i] ]
        }]
      },
      then: "range " + ranges[i-1] + "-" + ranges[i],
      else: ""
    }
  })
}

db.xx.aggregate([{
  $project: { "_id": 0, "range": rangeProj }
}, {
  $group: { _id: "$range", count: { $sum: 1 } }
}, {
  $sort: { "_id": 1 }
}]);

जो ऊपर जैसा ही परिणाम देगा।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. (मोंगोडीबी जावा) $पुश इन एरे

  2. मोंगोडीबी अपडेटऑन ()

  3. NoSQL (MongoDB) बनाम Lucene (या Solr) आपके डेटाबेस के रूप में

  4. मेरे नेवला स्कीमा में किसी अन्य स्कीमा का संदर्भ कैसे लें?

  5. MongoDB $ अंतिम एकत्रीकरण पाइपलाइन ऑपरेटर