sql >> Database teknologi >  >> NoSQL >> MongoDB

Max og gruppe ved i Mongodb

For at opnå det ønskede resultat, start med at nedbryde SQL-forespørgslen begyndende med underforespørgslen:

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

Den tilsvarende mongo-forespørgsel følger:

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

$group samlet ækvivalent af

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

følger

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

Top 5 forespørgsler

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

er gjort muligt med $ grænse operatør og feltvalg gennem $projekt scene som

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

OPDATERING

For at få det ønskede resultat fra prøven i denne redigering , du har brug for en ekstra $ sortere pipeline før $group hvor du sorterer dokumenterne efter TrendDate og Visning felter, begge i faldende rækkefølge.

Du bliver derefter nødt til at bruge $first akkumulatoroperatør inden for $gruppen pipeline fase for at få det maksimale indtryk, da du vil have en ordnet strøm af dokumenter i din pipeline.

Overvej at køre den reviderede samlede handling som:

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

Eksempeloutput

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

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



  1. Hvad er C#-ækvivalenten til push og root for MongoDB?

  2. Sådan analyseres og optimeres hukommelsesforbrug i Redis

  3. Udvikle databaseskema til underretning som facebook

  4. Spil 2.0 FakeApplication opsætning med testkonfiguration