MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Durchschnittliche Aggregation mit String-Zeitstempel

Realistischerweise "sollten" Sie hier die Zeitstempel-Strings festlegen. Aber sie sind zumindest in "lexikalischer Reihenfolge" aufgrund des Formats "yyyy-dd-mm", das ISO-Strings innewohnt.

Da sie also eine feste Länge haben, können wir sie tatsächlich aggregieren, indem wir das Aggregations-Framework für eine serverseitige Aggregation verwenden.

Auswahl des Monats Mai für die Datumsauswahl:

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

Dies würde die Summe "pro Tag" für jeden Tag im ausgewählten Monat erhalten. Dies beruht auf dem lexikalischen Wert der Felder. Hier gilt für alle Intervalle das gleiche Grundprinzip. Sie füllen also einfach die Zeichenfolgen mit den Nullwerten bis zu dem gewünschten Intervall für die Auswahl.

Dasselbe gilt hier für den "Gruppierungsschlüssel", wobei der Wert _id ist sollte in ähnlicher Weise die Teilzeichenfolge bis zum erforderlichen Intervall sein. Glücklicherweise ist das Zeichenfolgenformat "mit Nullen aufgefüllt", also Werte kleiner als "10" wird eine Null wie in "05" vorangestellt . Auch dies behält die lexikalische Reihenfolge für „Bereiche“ bei.

Das sollten Sie anstreben, und ich nehme an, Sie sollten Ihre Felder hier auswählen und die Zeitstempelzeichenfolgen für die Bereichsauswahl generieren.

Aber Sie können sicherlich etwas gewinnen, wenn Sie in der Lage sind, $group auf [$substr][2] Teil des tatsächlichen Werts, um Ihr erforderliches Intervall anzugeben, und Sie müssen nicht mehrere Abfrageaufrufe einfach für jedes Intervall durchlaufen und die Datenbank dies für Sie erledigen lassen.

Ihre "Schlüssel" sind jedoch ein weiteres Problem, und da sie nicht konsistent sind, scheinen Sie festgefahren zu sein, indem Sie die möglichen "Schlüsselnamen" durchlaufen und eine separate Aggregation für alle durchführen. Sie könnten die Anweisung möglicherweise länger machen und die "Zählungen" und "Summen" für jede mit $ifNull um zu bestimmen, wann erhöht werden soll. Dann würden Sie $divide „nach“ dem $group Pipeline-Phase, um den endgültigen "Durchschnitt" zu erhalten.

Das letzte Stück ist ein bisschen kompliziert, ohne den vollen Umfang zu kennen, und es ist nicht alles vollständig in Ihrer Frage. Also überlasse ich es Ihnen, das herauszufinden, oder stellen Sie eine separate Frage dazu.