MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Agrégation moyenne avec horodatage de chaîne

De manière réaliste, vous "devriez" corriger les chaînes d'horodatage ici. Mais ils sont au moins dans "l'ordre lexical" en raison du format "aaaa-jj-mm" inhérent aux chaînes ISO.

Ainsi, comme ils ont une longueur fixe, nous pouvons en fait les agréger à l'aide du cadre d'agrégation pour une agrégation côté serveur.

Échantillonnage du mois de mai pour la sélection de la date :

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

Cela obtiendrait le total "par jour" pour chaque jour du mois sélectionné. Cela repose sur la valeur lexicale des champs. Le même principe de base s'applique ici à tous les intervalles. Ainsi, vous remplissez simplement les chaînes avec les valeurs zéro jusqu'à l'intervalle souhaité pour la sélection.

Il en va de même pour la "clé de regroupement" ici, où la valeur de _id doit également être la sous-chaîne jusqu'à l'intervalle requis. Heureusement, le format de chaîne est "zéro rembourré", donc les valeurs inférieures à "10" sont précédés d'un zéro comme dans "05" . Encore une fois, cela maintient l'ordre lexical des "gammes".

C'est ce que vous devriez viser, et je suppose que vous devriez sélectionner vos champs ici, ainsi que générer les chaînes d'horodatage pour la sélection de plage.

Mais vous pouvez certainement gagner quelque chose en étant capable de $group sur le [$substr][2] une partie de la valeur réelle pour indiquer votre intervalle requis, et vous n'avez pas besoin d'itérer plusieurs appels de requête simplement pour chaque intervalle et laissez simplement la base de données le faire pour vous.

Vos "clés" sont cependant un autre problème, et comme elles ne sont pas cohérentes, vous semblez coincé à parcourir les "noms de clés" possibles et à effectuer une agrégation distincte pour chacun d'eux. Vous pouvez éventuellement allonger la déclaration et obtenir les "comptes" et les "sommes" pour chacun en utilisant $ifNull pour déterminer quand incrémenter. Ensuite, vous feriez $divide "après" le $group l'étape du pipeline pour obtenir la "moyenne" finale

Ce dernier élément est un peu compliqué sans connaître toute la portée, et tout n'est pas complètement dans votre question. Je vous laisse donc le soin de résoudre ce problème ou de poser une question distincte à ce sujet.