Secara realistis Anda "harus" memperbaiki string stempel waktu di sini. Tapi mereka setidaknya dalam "urutan leksikal" karena format "yyyy-dd-mm" yang melekat pada String ISO.
Jadi karena mereka memiliki panjang yang tetap, kita sebenarnya dapat menggabungkannya menggunakan kerangka kerja agregasi untuk agregasi sisi server.
Pengambilan sampel bulan Mei untuk pemilihan tanggal:
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[]" }
}}
])
Ini akan mendapatkan total "per hari" untuk setiap hari di bulan yang dipilih. Ini bergantung pada nilai leksikal bidang. Prinsip dasar yang sama berlaku untuk semua interval di sini. Jadi, Anda cukup mengisi string dengan nilai nol hingga interval yang Anda inginkan untuk dipilih.
Hal yang sama berlaku untuk "kunci pengelompokan" di sini, di mana nilainya menjadi _id
juga harus menjadi substring hingga interval yang diperlukan. Untungnya format string adalah "zero padded" jadi nilainya kurang dari "10"
didahului oleh nol seperti pada "05"
. Sekali lagi ini mempertahankan urutan leksikal untuk "rentang".
Itulah yang harus Anda tuju, dan saya kira Anda harus memilih bidang Anda di sini, serta menghasilkan string stempel waktu untuk pemilihan rentang.
Tapi Anda pasti bisa mendapatkan sesuatu dengan bisa $group
pada [$substr][2]
bagian dari nilai aktual untuk menunjukkan interval yang Anda perlukan, dan tidak perlu mengulangi beberapa permintaan kueri hanya untuk setiap interval dan biarkan database melakukannya untuk Anda.
Namun "kunci" Anda adalah masalah lain, dan karena tidak konsisten, Anda tampaknya terjebak dengan mengulangi kemungkinan "nama kunci" dan melakukan agregasi terpisah untuk semuanya. Anda mungkin dapat membuat pernyataan lebih lama dan mendapatkan "jumlah" dan "jumlah" untuk masing-masing menggunakan $ifNull
untuk menentukan kapan harus meningkat. Kemudian Anda akan $divide
"setelah" $group
tahap pipa untuk mendapatkan "rata-rata" akhir.
Bagian terakhir itu agak rumit tanpa mengetahui cakupan penuhnya, dan itu tidak sepenuhnya ada dalam pertanyaan Anda. Jadi saya akan menyerahkannya kepada Anda untuk menyelesaikannya, atau mengajukan pertanyaan terpisah.