MongoDB найти и повторить против счета - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть специфическая проблема с Mongo.

У нас есть коллекция из 800 тыс. Документов со следующей структурой.

{
"_id" : ObjectId("5bd844199114bab3b2c19fab"),
"u" : 0,
"c" : 0,
"iden" : "343754856",
"name" : "alan",
"email" : "mkasd@abc.com",
"mobile" : "987654321093456",
"expires" : ISODate("2018-11-29T11:44:25.453Z"),
"created" : ISODate("2018-10-30T11:44:25.453Z")
}

Мы проиндексировали iden и name, по которыммы обычно запрашиваем.Мы пробовали два типа запросов.

  1. db.Collection.find ({"iden": "343754856", "name": "alan", "созданный":
    {"$ gt": ....}). Count ()

    где "созданный" - это неиндексированное поле.

  2. db.Collection.find ({"iden": "343754856", "name": "alan"})

    и выполнять итерацию по всем записям для фильтрации на основе created.

Тем не менее, MongoDB, похоже, тратит огромное количество времени на выполнение второго запроса, в то время как предполагалось, что он будет оптимизирован по сравнению с 1.

Любые указания на то, что здесь происходит не так?Мы используем библиотеку Go.

1 Ответ

0 голосов
/ 29 ноября 2018

Как вторая версия может быть оптимизацией по сравнению с первой?

Ваш первый запрос получает одно число с сервера MongoDB: общее количество результатов запроса.В то время как ваша вторая версия извлекает все соответствующие документы, а вы выполняете подсчет на стороне «клиента».

Поверьте мне, MongoDB может внутренне подсчитывать полученные документы так же быстро, как вы могли бы в вашем клиенте Go.Чтобы сервер MongoDB отправлял результаты, извлекал их и демонтировал их на клиенте, требуется на порядки больше времени (в зависимости от множества факторов).

Обратите внимание, что если у вас есть составной индекс, содержащий "iden" и"name", даже если вы добавите больше фильтров (например, "created" в вашем примере), индекс все равно можно будет использовать, но MongoDB придется перебирать частичные результаты, чтобы применить остальную часть запроса.Чтобы выяснить, используется ли индекс, выполните следующую команду:

db.Collection.find(
    {"iden": "343754856", "name": "alan", "created": {"$gt": ....}
).explain()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...