sql >> Base de Datos >  >> NoSQL >> MongoDB

Agregación promedio con marca de tiempo de cadena

De manera realista, "debería" arreglar las cadenas de marca de tiempo aquí. Pero están al menos en "orden léxico" debido al formato "yyyy-dd-mm" inherente a las cadenas ISO.

Entonces, dado que tienen una longitud fija, podemos agregarlos utilizando el marco de agregación para una agregación del lado del servidor.

Muestreo del mes de mayo para selección de fecha:

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

Esto obtendría el total "por día" para cada día del mes seleccionado. Esto se basa en el valor léxico de los campos. El mismo principio básico se aplica aquí a todos los intervalos. Así que simplemente llena las cadenas con los valores cero hasta el intervalo en el que desea la selección.

Lo mismo ocurre con la "clave de agrupación" aquí, donde el valor de _id debe ser igualmente la subcadena hasta el intervalo requerido. Afortunadamente, el formato de cadena es "relleno con ceros", por lo que los valores son menores que "10" están precedidos por un cero como en "05" . De nuevo, esto mantiene el orden léxico de los "rangos".

Eso es a lo que debería apuntar, y supongo que debería seleccionar sus campos aquí, así como generar las cadenas de marca de tiempo para la selección de rango.

Pero ciertamente puede ganar algo si puede $group en el [$substr][2] parte del valor real para indicar su intervalo requerido, y no necesita iterar múltiples invocaciones de consulta simplemente para cada intervalo y dejar que la base de datos lo haga por usted.

Sin embargo, sus "claves" son otro problema, y ​​dado que no son consistentes, parece estar atascado iterando a través de los posibles "nombres clave" y realizando una agregación separada para todos ellos. Posiblemente podría hacer la declaración más larga y obtener los "recuentos" y las "sumas" para cada uno usando $ifNull para determinar cuándo incrementar. Entonces $divide "después" del $group etapa de canalización para obtener el "promedio" final.

Eso último es un poco complicado sin conocer el alcance completo, y no todo está completamente en su pregunta. Así que dejaré que lo resuelva usted o le haré una pregunta por separado.