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

Array grup agregat MongoDB ke kunci:nilai jumlah

Untuk formulir Anda yang sebenarnya, dan karena itu menganggap bahwa Anda benar-benar mengetahui kemungkinan nilai untuk "ketik" maka Anda dapat melakukan ini dengan dua $group tahapan dan beberapa penggunaan $cond operator:

db.types.aggregate([
    { "$group": {
         "_id": {
             "stat": "$stat",
             "type": "$type"
         },
         "count": { "$sum": 1 }
    }},
    { "$group": {
        "_id": "$_id.stat",
        "type1": { "$sum": { "$cond": [
            { "$eq": [ "$_id.type", 1 ] },
            "$count",
            0
        ]}},
        "type2": { "$sum": { "$cond": [
            { "$eq": [ "$_id.type", 2 ] },
            "$count",
            0
        ]}},
        "type3": { "$sum": { "$cond": [
            { "$eq": [ "$_id.type", 3 ] },
            "$count",
            0
        ]}}
    }}
])

Yang memberikan persis:

{ "_id" : "foobar", "type1" : 2, "type2" : 1, "type3" : 1 }

Saya sebenarnya lebih suka bentuk yang lebih dinamis dengan dua $group tahapan sekalipun:

db.types.aggregate([
    { "$group": {
         "_id": {
             "stat": "$stat",
             "type": "$type"
         },
         "count": { "$sum": 1 }
    }},
    { "$group": {
        "_id": "$_id.stat",
        "types": { "$push": {
            "type": "$_id.type",
            "count": "$count"
        }}
    }}
])

Bukan keluaran yang sama tetapi fungsional dan fleksibel terhadap nilai:

{
    "_id" : "foobar",
    "types" : [
            {
                    "type" : 3,
                    "count" : 1
            },
            {
                    "type" : 2,
                    "count" : 1
            },
            {
                    "type" : 1,
                    "count" : 2
            }
    ]
}

Jika tidak, jika Anda memerlukan format keluaran yang sama tetapi membutuhkan bidang yang fleksibel maka Anda selalu dapat menggunakan mapReduce, tetapi keluarannya tidak persis sama.

db.types.mapReduce(
    function () {

        var obj = { };

        var key = "type" + this.type;
        obj[key] = 1;

        emit( this.stat, obj );

    },
    function (key,values) {

        var obj = {};

        values.forEach(function(value) {
            for ( var k in value ) {
                if ( !obj.hasOwnProperty(k) )
                    obj[k] = 0;
                obj[k]++;
            }
        });

        return obj;

    },
    { "out": { "inline": 1 } }
)

Dan dalam gaya khas mapReduce:

   "results" : [
            {
                    "_id" : "foobar",
                    "value" : {
                            "type1" : 2,
                            "type2" : 1,
                            "type3" : 1
                    }
            }
    ],

Tapi itu pilihanmu



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana Anda bisa menghapus semua dokumen dari koleksi dengan Mongoose?

  2. MongoDB Hubungan Satu ke Banyak

  3. Setara dengan mongo shell db.collection.runCommand() di Node.js

  4. Lakukan penyatuan di mongoDB

  5. Bagaimana cara menulis bentuk bson dari kueri mongo di golang?