Bạn có chắc chắn rằng chỉ mục của bạn đã được tạo không? bạn có thể cung cấp đầu ra của getIndexes()
không trong bộ sưu tập của bạn
ví dụ:db.my_collection.getIndexes()
và giải thích về truy vấn của bạn
db.my_collection.find({created_at_year: 2014, created_at_month: 1, created_at_day: 28 }).explain()
Tái bút:tất nhiên tôi phải đồng ý với @Aesthete về thực tế là bạn lưu trữ nhiều hơn mức bạn cần ...
Cập nhật ngày 29 tháng 1 năm 2014
Hoàn hảo! Như bạn thấy, bạn có bốn chỉ mục khác nhau khi bạn có thể tạo MỘT chỉ mục kết hợp sẽ bao gồm tất cả chúng.
xác định
db.my_collection.ensureIndex({created_at_year: 1, created_at_month: 1, created_at_day: 1, created_at_hour: 1 })
sẽ cung cấp cho bạn một chỉ mục chính xác hơn cho phép bạn truy vấn về:
-
year
-
year
vàmonth
-
year
vàmonth
vàday
-
year
vàmonth
vàday
vàhour
Điều này sẽ làm cho các truy vấn của bạn (với bốn khóa) nhanh hơn nhiều, bởi vì tất cả các tiêu chí của bạn sẽ được đáp ứng trong dữ liệu chỉ mục!
xin lưu ý rằng thứ tự của các khóa trong ensureIndex()
rất quan trọng, thứ tự đó thực sự xác định danh sách các truy vấn được đề cập ở trên!
Cũng lưu ý rằng nếu tất cả những gì bạn cần là 4 trường này, hơn là nếu bạn chỉ định một phép chiếu chính xác, ví dụ:
db.my_collection.find({created_at_year: 2014, created_at_month: 1, created_at_day: 28}, { created_at_year: 1, created_at_month: 1, created_at_day: 1 })
thì chỉ có chỉ mục sẽ được sử dụng, đó là hiệu suất tối đa!