Realistycznie „powinieneś” poprawić tutaj ciągi znaczników czasu. Ale są one przynajmniej w „porządku leksykalnym” ze względu na format „rrrr-dd-mm” nieodłączny od ciągów ISO.
Tak więc, ponieważ mają one stałą długość, możemy faktycznie na nich agregować za pomocą struktury agregacji dla agregacji po stronie serwera.
Próbkowanie miesiąca maja do wyboru daty:
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[]" }
}}
])
Spowoduje to otrzymanie sumy „na dzień” dla każdego dnia w wybranym miesiącu. Opiera się to na leksykalnej wartości pól. Ta sama podstawowa zasada dotyczy tutaj wszystkich interwałów. Więc po prostu wypełniasz ciągi wartościami zerowymi aż do przedziału, w którym chcesz dokonać wyboru.
To samo dotyczy „klucza grupującego” tutaj, gdzie wartość _id
podobnie powinien być podciągiem aż do wymaganego interwału. Na szczęście format ciągu jest „dopełniony zerami”, więc wartości są mniejsze niż „10”
są poprzedzone zerem, jak w "05"
. Ponownie zachowuje to porządek leksykalny dla „zakresów”.
To jest to, do czego powinieneś dążyć i przypuszczam, że powinieneś wybierać tutaj swoje pola, a także generować ciągi znaczników czasu dla wyboru zakresu.
Ale z pewnością możesz coś zyskać, będąc w stanie $group
na [$substr][2]
część rzeczywistej wartości, aby wskazać wymagany interwał, i nie trzeba powtarzać wielu wywołań zapytań po prostu dla każdego interwału i po prostu pozwolić, aby baza danych zrobiła to za Ciebie.
Twoje „klucze” to jednak inny problem, a ponieważ nie są one spójne, wydaje się, że utknąłeś z iteracją możliwych „nazw kluczy” i wykonaniem oddzielnej agregacji dla nich wszystkich. Możesz ewentualnie wydłużyć oświadczenie i uzyskać „counts” i „sums” dla każdego, używając $ifNull
aby określić, kiedy należy zwiększyć. Wtedy $divide
"po" $group
etap potoku, aby uzyskać ostateczną „średnią”.
Ten ostatni fragment jest nieco skomplikowany bez znajomości pełnego zakresu i nie jest to całkowicie w twoim pytaniu. Więc zostawię to tobie do rozpracowania lub zadam osobne pytanie.