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

kumpulan data kelompok dengan beberapa bidang mongodb

Dengan kerangka kerja agregasi, hasilnya akan sedikit berbeda dari keluaran "yang diinginkan" karena alih-alih memiliki kunci hash, Anda mendapatkan larik objek dengan _id kunci yang memiliki nilai yang mewakili Anda mengelompokkan berdasarkan bidang. Misalnya, alih-alih

{
    "28-10-2016":{
        "success_count": 10, 
        "failure_count": 10
    },
    "29-10-2016": {
        "success_count": 10, 
        "failure_count": 10
    }
}

Anda akan memiliki struktur yang lebih baik seperti

[
    {
        "_id": "28-10-2016",
        "success_count": 10, 
        "failure_count": 10
    },
        "_id": "29-10-2016",
        "success_count": 10, 
        "failure_count": 10
    }
]

Untuk mencapai hasil di atas akan memerlukan penggunaan $cond operator di $sum operator akumulator. $cond operator akan mengevaluasi kondisi logis berdasarkan argumen pertama (jika) dan kemudian mengembalikan argumen kedua di mana evaluasi itu benar (kemudian) atau argumen ketiga di mana salah (lain). Ini mengubah logika benar/salah menjadi nilai numerik 1 dan 0 yang dimasukkan ke $sum masing-masing:

"success_count": {
    "$sum": {
        "$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
    }
}

Sebagai pipa yang dihasilkan, seseorang perlu menjalankan operasi agregasi yang menggunakan $dateToString operator di _id ekspresi kunci untuk $group saluran:

Orders.aggregate([
    {
        "$group": {
            "_id": {
                "$dateToString": { 
                    "format": "%Y-%m-%d", 
                    "date": "$created_at" 
                }
            },
            "success_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
                }
            },
            "failure_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$status", "failure" ] }, 1, 0 ]
                }
            }
        }
    }
], function (err, orders){
    if (err) throw err;
    console.log(orders);
})

Namun, ada pendekatan yang lebih fleksibel dan berkinerja lebih baik yang dijalankan jauh lebih cepat daripada di atas, di mana struktur data yang paling efisien untuk hasil agregasi Anda mengikuti skema misalnya:

orders = [
    {
        "_id": "28-10-2016",
        "counts": [
            { "status": "success", "count": 10 },
            { "status": "failure", "count": 10 }
        ]
    },
    {
        "_id": "29-10-2016",
        "counts": [
            { "status": "success", "count": 10 },
            { "status": "failure", "count": 10 }
        ]
    }
]

Kemudian pertimbangkan untuk menjalankan jalur pipa alternatif sebagai berikut

Orders.aggregate([
    { 
        "$group": {
            "_id": { 
                "date":  {
                    "$dateToString": { 
                        "format": "%Y-%m-%d", 
                        "date": "$created_at" 
                    }
                },
                "status": { "$toLower": "$status" }
            },
            "count": { "$sum": 1 }
        }
    },
    { 
        "$group": {
            "_id": "$_id.date",
            "counts": {
                "$push": {
                    "status": "$_id.status",
                    "count": "$count"
                }
            }
        }
    }
], function (err, orders){
    if (err) throw err;
    console.log(orders);
})



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menerapkan/Mengganti MongoRepository Pertahankan Pemformatan HATEOAS

  2. Migrasikan data dari PostgreSQL ke MongoDB

  3. Bagaimana cara menemukan dokumen berdasarkan bagian ObjectId?

  4. Gunakan $stdDevSamp atau $stdDevPop dengan Spring Mongo

  5. Perbarui gambar menggunakan collectionfs