Thực tế, bạn "nên" sửa các chuỗi dấu thời gian ở đây. Nhưng chúng ít nhất theo "thứ tự từ vựng" do định dạng "yyyy-dd-mm" vốn có trong Chuỗi ISO.
Vì vậy, vì chúng có độ dài cố định, chúng tôi thực sự có thể tổng hợp chúng bằng cách sử dụng khung tổng hợp cho tổng hợp phía máy chủ.
Lấy mẫu tháng 5 để chọn ngày:
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[]" }
}}
])
Điều này sẽ nhận được tổng số "mỗi ngày" cho mỗi ngày trong tháng đã chọn. Điều này phụ thuộc vào giá trị từ vựng của các trường. Nguyên tắc cơ bản giống nhau áp dụng cho tất cả các khoảng ở đây. Vì vậy, bạn chỉ cần điền vào các chuỗi với các giá trị 0 cho đến khoảng thời gian bạn muốn lựa chọn.
Tương tự với "khóa nhóm" ở đây, trong đó giá trị của _id
tương tự sẽ là chuỗi con lên đến khoảng thời gian cần thiết. May mắn thay, định dạng chuỗi là "không đệm" nên các giá trị nhỏ hơn "10"
đứng trước số 0 như trong "05"
. Một lần nữa, điều này duy trì thứ tự từ vựng cho "phạm vi".
Đó là những gì bạn nên hướng tới và tôi cho rằng bạn nên chọn các trường của mình tại đây, cũng như tạo các chuỗi dấu thời gian để lựa chọn phạm vi.
Nhưng bạn chắc chắn có thể đạt được điều gì đó bằng cách có thể $group
trên [$substr][2]
một phần của giá trị thực tế để chỉ ra khoảng thời gian yêu cầu của bạn và không cần lặp lại nhiều lệnh gọi truy vấn chỉ đơn giản cho mỗi khoảng thời gian và chỉ cần để cơ sở dữ liệu làm điều đó cho bạn.
Tuy nhiên, "khóa" của bạn lại là một vấn đề khác và vì chúng không nhất quán nên bạn có vẻ bị mắc kẹt với việc lặp lại các "tên khóa" có thể có và thực hiện tổng hợp riêng biệt cho tất cả chúng. Bạn có thể tạo câu lệnh dài hơn và nhận "số" và "tổng" cho mỗi câu bằng cách sử dụng $ifNull
để xác định thời điểm tăng. Sau đó, bạn sẽ $divide
"sau" $group
giai đoạn chuyển tiếp để nhận được "mức trung bình" cuối cùng.
Phần cuối cùng đó hơi phức tạp nếu không biết toàn bộ phạm vi và nó không hoàn toàn nằm trong câu hỏi của bạn. Vì vậy, tôi sẽ giao việc đó cho bạn giải quyết hoặc đặt một câu hỏi riêng về.