MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Melakukan pernyataan kasus dalam kerangka agregasi mongodb

apa yang sesuai dengan pernyataan SQL "kasus" dalam kerangka kerja agregasi, adalah operator $cond (lihat manual). Pernyataan $cond dapat disarangkan untuk mensimulasikan "kapan-maka" dan "lain", tetapi saya telah memilih pendekatan lain, karena lebih mudah dibaca (dan untuk menghasilkan, lihat di bawah):Saya akan menggunakan operator $concat untuk menulis string rentang, yang kemudian berfungsi sebagai kunci pengelompokan.

Jadi untuk koleksi yang diberikan:

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 }

agregat (hardcoded) terlihat seperti ini:

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 } },
]);

dan hasilnya adalah:

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

Untuk menghasilkan perintah agregat, Anda harus membuat proyeksi "rentang" sebagai objek JSON ( atau Anda dapat membuat string dan kemudian menggunakan JSON.parse(string) )

Generatornya terlihat seperti ini:

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 }
}]);

yang akan mengembalikan hasil yang sama seperti di atas.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Luwak findByIdAndUpdate tidak mengembalikan model yang benar

  2. Bagaimana cara mendapatkan catatan N terakhir di mongodb?

  3. Mongodb memperbarui subdokumen yang sangat bersarang

  4. Cara Memeriksa Apakah Indeks Tersembunyi di MongoDB

  5. MongoDB $toLower