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

Aggregazione media con timestamp stringa

Realisticamente "dovresti" correggere le stringhe di timestamp qui. Ma sono almeno in "ordine lessicale" a causa del formato "aaaa-gg-mm" inerente alle stringhe ISO.

Quindi, poiché hanno una lunghezza fissa, possiamo effettivamente aggregarli utilizzando il framework di aggregazione per un'aggregazione lato server.

Campionamento del mese di maggio per la selezione della data:

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

Questo otterrebbe il totale "al giorno" per ogni giorno del mese selezionato. Ciò si basa sul valore lessicale dei campi. Lo stesso principio di base si applica a tutti gli intervalli qui. Quindi riempi semplicemente le stringhe con i valori zero fino all'intervallo in cui desideri selezionare la selezione.

Lo stesso vale per la "chiave di raggruppamento" qui, dove il valore di _id dovrebbe essere allo stesso modo la sottostringa fino all'intervallo richiesto. Fortunatamente il formato della stringa è "zero imbottito", quindi valori inferiori a "10" sono preceduti da uno zero come in "05" . Anche in questo caso viene mantenuto l'ordine lessicale degli "intervalli".

Questo è ciò a cui dovresti mirare e presumo che dovresti selezionare i tuoi campi qui, oltre a generare le stringhe di timestamp per la selezione dell'intervallo.

Ma puoi sicuramente guadagnare qualcosa potendo $group su [$substr][2] parte del valore effettivo per indicare l'intervallo richiesto e non è necessario ripetere più chiamate di query semplicemente per ogni intervallo e lasciare che il database lo faccia per te.

Le tue "chiavi" tuttavia sono un altro problema e, poiché non sono coerenti, sembri bloccato nell'iterare i possibili "nomi delle chiavi" e nell'esecuzione di un'aggregazione separata per tutti loro. Potresti eventualmente rendere la dichiarazione più lunga e ottenere i "conteggi" e le "somme" per ciascuno utilizzando $ifNull per determinare quando incrementare. Quindi dovresti $divide "dopo" il $group fase della pipeline per ottenere la "media" finale.

Quest'ultimo bit è un po' complicato senza conoscere l'intera portata e non è tutto completamente nella tua domanda. Quindi lascio a te il compito di risolverlo o porre una domanda separata in merito.