MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Agregação média com carimbo de data/hora de string


Realisticamente, você "deveria" corrigir as strings de carimbo de data/hora aqui. Mas eles estão pelo menos em "ordem lexical" devido ao formato "aaaa-dd-mm" inerente às Strings ISO.

Portanto, como eles têm um comprimento fixo, podemos agregá-los usando a estrutura de agregação para uma agregação do lado do servidor.

Amostragem do mês de maio para seleção de 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[]" }
  }}
])

Isso obteria o total "por dia" para cada dia no mês selecionado. Isso depende do valor léxico dos campos. O mesmo princípio básico se aplica a todos os intervalos aqui. Então você simplesmente preenche as strings com os valores zero até o intervalo que deseja a seleção.

O mesmo vale para a "chave de agrupamento" aqui, onde o valor para _id deve ser da mesma forma a substring até o intervalo necessário. Felizmente, o formato da string é "preenchido com zero", portanto, valores menores que "10" são precedidos por um zero como em "05" . Novamente, isso mantém a ordem lexical para "intervalos".

É isso que você deve buscar, e presumo que você deva selecionar seus campos aqui, bem como gerar as strings de carimbo de data/hora para a seleção de intervalo.

Mas você certamente pode ganhar algo sendo capaz de $group no [$substr][2] parte do valor real para indicar o intervalo necessário e não precisar iterar várias invocações de consulta simplesmente para cada intervalo e apenas deixar o banco de dados fazer isso por você.

Suas "chaves", no entanto, são outro problema e, como não são consistentes, você parece preso à iteração pelos possíveis "nomes de chave" e à execução de uma agregação separada para todos eles. Você poderia tornar a declaração mais longa e obter as "contagens" e "somas" para cada um usando $ifNull para determinar quando incrementar. Então você $divide "depois" do $group etapa de pipeline para obter a "média" final.

Essa última parte é um pouco complicada sem conhecer o escopo completo e não está totalmente na sua pergunta. Então, vou deixar isso para você resolver, ou fazer uma pergunta separada sobre.