Запрос MongoDB count () возвращает устаревший результат в оболочке mongo - PullRequest
0 голосов
/ 18 февраля 2019

Документы в моей коллекции MongoDB очень часто меняют поле статуса.Я вижу это очень ясно, используя клиент mongoDB (Robo 3T).

Теперь я хотел бы отслеживать этот процесс, используя mongo shell:

mongo --host=localhost db --eval "db.getCollection('events').find({status:'ACTIVE'}).count()"

Это возвращает правильныйрезультат, но затем mongoDB «кэширует» его и не будет возвращать обновленный результат в течение еще ~ 10 секунд.Мне нужно обновлять каждые 200 мс.

Один и тот же запрос от Robo 3T всегда возвращает обновленный результат в ~ 5 мс.

Из моих наблюдений, когда нагрузка ниже, оболочка Монгообновления количества приходят на каждый запрос.

Я не могу найти никакой информации о механизмах, подобных кешу, в документации MongoDB.Как я могу отключить это?Почему с Robo 3T все работает нормально?

PS

Я наблюдал то же поведение со скриптом Python, который опрашивает mongo с запросом count () - результаты кэшируются.Но как только я начинаю выполнять запрос в Robo 3T, числа начинают двигаться в оболочке python и mongo!Что происходит?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Используйте itcount () , который фактически выполняет запрос на существующем итераторе.

mongo --host=localhost db \
    --eval "db.getCollection('events').find({status:'ACTIVE'}).itcount()"
0 голосов
/ 18 февраля 2019

Попробуйте удалить все кэшированные планы запросов для коллекции:

db.collection.getPlanCache().clear()

, если вы не измените условие where, обновления будут кэшироваться.

Doc: Кэш плана

...