Намерих отговора си в този въпрос:Ред на $lt и $gt в заявка за диапазон на MongoDB
Моят индекс е многоключов индекс (на tags
) и изпълнявам заявка за диапазон (на post_time
). Очевидно
, MongoDB не може да използва двете страни на диапазона като филтър в този случай, така че просто избира $gte
клауза, която е първа. Тъй като моята долна граница е най-ниското post_time
стойност, MongoDB започва да сканира всички обекти.
За съжаление това не е цялата история. Опитвайки се да разреша проблема, създадох и индекси без много клавиши, но MongoDB настоя да използва лошия. Това ме накара да мисля, че проблемът е другаде. Накрая трябваше да премахна многоключовия индекс и да създам такъв без tags
поле. Вече всичко е наред.