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

Maks dan kelompokkan di Mongodb

Untuk mencapai hasil yang diinginkan, mulailah dengan memecah kueri SQL yang dimulai dengan sub kueri:

Select *
from tblData 
Where TFN in (Select TFN From @tmpTFNList) and TrendDate between @StartDate AND @EndDate

Kueri mongo yang setara berikut ini:

db.getCollection("_core.data").aggregate([
    {
        "$match": {
            "TFN": { "$in": tmpTFNList },
            "TrendDate": {
                "$gte": startDate,
                "$lte": endDate
            }
        }
    }
])

$group agregat setara

Select TFN, Max(Impressions) MaxImpression 
from tblData 
Where TFN in (Select TFN From @tmpTFNList) and TrendDate between @StartDate AND @EndDate
Group by TFN 

mengikuti

db.getCollection("_core.data").aggregate([
    {
        "$match": {
            "TFN": { "$in": tmpTFNList },
            "TrendDate": {
                "$gte": startDate,
                "$lte": endDate
            }
        }
    },
    {
        "$group": {
            "_id": "$TFN",
            "MaxImpression": { "$max": "$Impression" }
        }
    }
])

5 kueri teratas

Select Top 5 a.TFN, a.MaxImpression as MaxCount from ( 
    Select TFN, Max(Impressions) MaxImpression 
    from tblData 
    Where TFN in (Select TFN From @tmpTFNList) 
        and TrendDate between @StartDate AND @EndDate
    Group by TFN 
) a

dimungkinkan dengan $limit operator dan pemilihan bidang melalui $project panggung sebagai

db.getCollection("_core.data").aggregate([
    { /* WHERE TFN in list AND TrendDate between DATES */
        "$match": {
            "TFN": { "$in": tmpTFNList },
            "TrendDate": {
                "$gte": startDate,
                "$lte": endDate
            }
        }
    },
    { /* GROUP BY TFN */
        "$group": {
            "_id": "$TFN",
            "MaxImpression": { "$max": "$Impression" }
        }
    },
    { "$limit": 5 }, /* TOP 5 */
    { /* SELECT a.MaxImpression as MaxCount */
        "$project": {
            "TFN": "$_id",
            "_id": 0,
            "MaxCount": "$MaxImpression"
        }
    }
])

PERBARUI

Untuk mendapatkan hasil yang diinginkan dari sampel dalam edit ini , Anda memerlukan tambahan $sort pipeline sebelum $group tempat Anda mengurutkan dokumen berdasarkan TrendDate dan Impression bidang, keduanya dalam urutan menurun.

Anda kemudian harus menggunakan $first operator akumulator dalam $group tahap pipa untuk mendapatkan kesan maksimal karena Anda akan memiliki aliran dokumen yang teratur dalam pipa Anda.

Pertimbangkan untuk menjalankan operasi agregat yang direvisi sebagai:

db.getCollection('collection').aggregate([
    { 
        "$match": {
            "TFN": { "$in": tmpTFNList },
            "TrendDate": {
                "$gte": startDate,
                "$lte": endDate
            }
        }
    },
    { "$sort": { "TrendDate": -1, "Impression": -1 } },
    {  
        "$group": {
            "_id": "$TFN",
            "MaxImpression": { "$first": "$Impression" }
        }
    },
    { "$limit": 5 }, 
    {   
        "$project": {
            "TFN": "$_id",
            "_id": 0,
            "MaxCount": "$MaxImpression"
        }
    }
])

Contoh Keluaran

/* 1 */
{
    "TFN" : 84251456,
    "MaxCount" : 22
}

/* 2 */
{
    "TFN" : 84251455,
    "MaxCount" : 35
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara Menyebarkan Database Open edX MongoDB untuk Ketersediaan Tinggi

  2. Bidang tambahan ke koleksi yang ada

  3. Bagaimana cara mengganti string di semua dokumen di Mongo

  4. Mengelola Jurnal di MongoDB

  5. Laravel 5 mengeksekusi agregasi dengan mongodb di mana klausa