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

Gennemsnitlig aggregation med streng tidsstempel

Realistisk set "bør" du rette tidsstemplets strenge her. Men de er i det mindste i "leksikalsk rækkefølge" på grund af "åååå-dd-mm"-formatet, der er iboende i ISO-strenge.

Så da de har en fast længde, kan vi faktisk aggregere dem ved hjælp af aggregeringsrammen til en aggregering på serversiden.

Prøver maj måned for valg af dato:

cursor = client[page1.currentDB][page2.currentColl].aggregate([
  { "$match": {
     "Technique-Meteo_Direction moyenne du vent_Mean value wind direction[]":
       { "$exists": True },
     "timestamp": {
       "$gte": "2017-05-01 00:00:00", "$lt": "2017-06-01 00:00:00"
     }
  }},
  { "$group": {
    "_id": {
      "$substr": [ "$timestamp", 0, 10 ]
    },
    "average":
      { "$avg": "$Technique-Meteo_Direction moyenne du vent_Mean value wind direction[]" }
  }}
])

Dette ville få det samlede antal "per dag" for hver dag i den valgte måned. Dette afhænger af felternes leksikalske værdi. Det samme grundprincip gælder for alle intervaller her. Så du skal blot udfylde strengene med nulværdierne indtil det interval, du ønsker at vælge.

Det samme gælder for "grupperingsnøglen" her, hvor værdien til _id bør på samme måde være understrengen indtil det påkrævede interval. Heldigvis er strengformatet "nulpolstret", så værdier er mindre end "10" indledes med et nul som i "05" . Igen dette opretholder den leksikalske rækkefølge for "intervaller".

Det er det, du bør sigte efter, og jeg formoder, at du skal vælge dine felter her, samt generere tidsstemplingsstrengene for udvalget af område.

Men du kan helt sikkert vinde noget ved at være i stand til at $group på [$substr][2] del af den faktiske værdi for at angive dit påkrævede interval og ikke behøver at gentage flere forespørgselskald blot for hvert interval og bare lade databasen gøre det for dig.

Dine "nøgler" er imidlertid et andet problem, og da de ikke er konsistente, ser du ud til at sidde fast i at gentage de mulige "nøglenavne" og udføre en separat aggregering for dem alle. Du kan muligvis gøre erklæringen længere og få "tæller" og "summer" for hver ved at bruge $ifNull for at bestemme, hvornår der skal øges. Så ville du $divide "efter" $group pipeline fase for at få det endelige "gennemsnit".

Det sidste er lidt kompliceret uden at kende det fulde omfang, og det hele er ikke helt i dit spørgsmål. Så jeg overlader det til dig at finde ud af, eller stille et separat spørgsmål om.




  1. er der en mongoose connect fejl tilbagekald

  2. Hvad er formålet med koloner i Redis-nøgler

  3. $elemmatch virker ikke i MongoDB

  4. Sådan får du alle resultater, hvis afspændingsfeltet ikke findes i mongodb