MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Max i grupa w Mongodb

Aby osiągnąć pożądany rezultat, zacznij od rozbicia zapytania SQL zaczynającego się od podzapytania:

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

Odpowiednik zapytania mongo wygląda następująco:

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

$group zagregowany odpowiednik

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

obserwuje

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

Top 5 zapytań

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

jest to możliwe dzięki $ limit operator i wybór pól za pomocą $projekt etap 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"
        }
    }
])

AKTUALIZACJA

Aby uzyskać pożądany wynik z próbki w tej edycji , potrzebujesz dodatkowego $ sortuj potok przed $group gdzie sortujesz dokumenty według TrendDate i Wyświetlenie pola, oba w kolejności malejącej.

Następnie będziesz musiał użyć $pierwszy operator akumulatora w grupie $ etap potoku, aby uzyskać maksymalne wrażenie, ponieważ będziesz mieć uporządkowany strumień dokumentów w swoim potoku.

Rozważ uruchomienie poprawionej operacji zbiorczej 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"
        }
    }
])

Przykładowe wyjście

/* 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. Jak utworzyć niestandardowe zapytanie za pomocą django-nonrel i mongodb

  2. Czy GridFS jest wystarczająco szybki i niezawodny do produkcji?

  3. MongoTemplate Zapytanie o kryteria

  4. Znajdowanie kolejnego dokumentu w MongoDb

  5. Mongodb find nie działa z Objectid