sql >> Databáze >  >> NoSQL >> MongoDB

Max a skupina v Mongodb

Chcete-li dosáhnout požadovaného výsledku, začněte rozčleněním dotazu SQL počínaje dílčím dotazem:

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

Následuje ekvivalentní mongo dotaz:

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

$group souhrnný ekvivalent

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

následuje

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

5 nejčastějších dotazů

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

je to možné pomocí $ limit operátor a výběr polí pomocí $projekt fázi jako

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

AKTUALIZACE

Chcete-li získat požadovaný výsledek ze vzorku v této úpravě , potřebujete další $ seřadit potrubí před $group kde třídíte dokumenty podle TrendDate a Zobrazení pole, obě v sestupném pořadí.

Poté budete muset použít $first operátor akumulátoru ve skupině $group fázi zřetězení, abyste získali maximální dojem, protože budete mít ve svém kanálu uspořádaný proud dokumentů.

Zvažte spuštění revidované agregační operace jako:

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

Ukázkový výstup

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

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



  1. Při instalaci MongoDB na RedHat se zobrazí chyba

  2. Jarní bota s MongoTemplate

  3. Rails Redis nastavení maxmemory a maxmemory-policy

  4. Sidekiq nezpracovává frontu