sql >> Database >  >> NoSQL >> MongoDB

Gemiddelde aggregatie met tekenreekstijdstempel

Realistisch gezien "zou" u de tijdstempelreeksen hier moeten corrigeren. Maar ze zijn in ieder geval in "lexicale volgorde" vanwege het "jjjj-dd-mm" formaat dat inherent is aan ISO Strings.

Omdat ze dus een vaste lengte hebben, kunnen we ze daadwerkelijk aggregeren met behulp van het aggregatieraamwerk voor een server-side-aggregatie.

Sampling van de maand mei voor datumselectie:

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

Dit zou het totale "per dag" voor elke dag in de geselecteerde maand krijgen. Dit is afhankelijk van de lexicale waarde van de velden. Hier geldt hetzelfde basisprincipe voor alle intervallen. U vult dus gewoon de strings met de nulwaarden tot het interval dat u de selectie wilt hebben.

Hetzelfde geldt hier voor de "groeperingssleutel", waar de waarde voor _id zou op dezelfde manier de substring moeten zijn tot het vereiste interval. Gelukkig is het tekenreeksformaat "nul opgevuld", dus waarden kleiner dan "10" worden voorafgegaan door een nul zoals in "05" . Nogmaals, dit handhaaft de lexicale volgorde voor "bereiken".

Dat is waar je naar moet streven, en ik neem aan dat je hier je velden moet selecteren, en ook de tijdstempelreeksen voor de bereikselectie moet genereren.

Maar je kunt zeker iets winnen door $group op de [$substr][2] deel van de werkelijke waarde om uw vereiste interval aan te geven, en u hoeft niet voor elk interval meerdere query-aanroepen te herhalen en laat de database het voor u doen.

Uw "sleutels" zijn echter een ander probleem, en aangezien ze niet consistent zijn, lijkt u vast te zitten aan het herhalen van de mogelijke "sleutelnamen" en het uitvoeren van een afzonderlijke aggregatie voor alle. Je zou de verklaring mogelijk langer kunnen maken en de "counts" en "sums" voor elk kunnen krijgen met behulp van $ifNull om te bepalen wanneer te verhogen. Dan zou je $divide "na" de $group pijplijnfase om het laatste "gemiddelde" te krijgen.

Dat laatste is een beetje ingewikkeld zonder de volledige reikwijdte te kennen, en het is niet allemaal volledig in uw vraag. Dus ik laat dat aan jou over om uit te werken, of stel er een aparte vraag over.




  1. De PHP 7 MongoDB Client/Driver installeren?

  2. Mongo Map-Reduce To Mimic count (distinct(...)) group by in SQL

  3. Verbinding met Redis-cluster mislukt

  4. 3 manieren om een ​​index in MongoDB te plaatsen