Подтвердить что ты не робот

MongoDB {aggregation $match} vs {find} speed

У меня есть коллекция mongoDB с миллионами строк, и я пытаюсь оптимизировать свои запросы. В настоящее время я использую структуру агрегации для извлечения данных и группировки их по мере необходимости. Мой типичный запрос агрегации - это что-то вроде: $match > $group > $ group > $project

Однако я заметил, что последние части занимают всего несколько мс, начало самое медленное.

Я попытался выполнить запрос только с фильтром соответствия $, а затем выполнить тот же запрос с помощью collection.find. Запрос агрегации занимает ~ 80 мс, в то время как запрос на поиск занимает 0 или 1 мс.

У меня есть индексы почти для каждого поля, поэтому я думаю, что это не проблема. Любая идея о том, что может пойти не так? Или это просто "нормальный" недостаток структуры агрегации?

Я мог бы использовать запросы на поиск вместо запросов агрегирования, однако мне пришлось бы выполнить много обработки после запроса, и этот процесс можно быстро выполнить с помощью $group и т.д., поэтому я предпочел бы сохранить структуру агрегации.

Спасибо,

ИЗМЕНИТЬ:

Вот мои критерии:

{
    "action" : "click",
    "timestamp" : {
            "$gt" : ISODate("2015-01-01T00:00:00Z"),
            "$lt" : ISODate("2015-02-011T00:00:00Z")
    },
    "itemId" : "5"
}
4b9b3361

Ответ 1

Основная цель aggregation framework состоит в том, чтобы облегчить запрос большого количества записей и сгенерировать небольшое количество результатов, которые имеют значение для вас.

Как вы уже сказали, вы также можете использовать несколько запросов find, но помните, что вы не можете создавать новые поля с запросами find. С другой стороны, этап $group позволяет вам определять новые поля.

Если вы хотите достичь функциональности aggregation framework, вам, скорее всего, придется запустить начальный find (или цепочку нескольких), вытащить эту информацию и дальше манипулировать ею с помощью языка программирования.

aggregation pipeline может показаться, что он занимает больше времени, но, по крайней мере, вы знаете, что вам нужно только учитывать производительность одной системы - движок MongoDB.

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

Ответ 2

Пробовали ли вы использовать explain() для поиска? Это даст вам представление о том, сколько времени займет запрос find(). Вы можете сделать то же самое для $match с $explain и посмотреть, есть ли разница в доступе индекса и других параметрах.

Кроме того, часть $group в структуре агрегации не использует индексацию, поэтому она должна обрабатывать все записи, возвращенные на этапе $match структуры агрегации. Поэтому, чтобы лучше понять работу вашего запроса, см. Результат, который он возвращает, и входит ли он в память для обработки MongoDB.