Начиная с MongoDB версии 3.0, просто изменив порядок с
collection.aggregate(...).explain()
в
collection.explain().aggregate(...)
даст вам желаемый результат (документация здесь ).
Для более старых версий> = 2.6 вам нужно будет использовать explainопцию для операций конвейера агрегации
explain:true
db.collection.aggregate([
{ $project : { "Tags._id" : 1 }},
{ $unwind : "$Tags" },
{ $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
{ $group: {
_id : "$_id",
count: { $sum:1 }
}},
{$sort: {"count":-1}}
],
{
explain:true
}
)
Важные с Aggregation Framework является то , что индекс может быть использован только для извлечения исходных данных для трубопровода (например , использование $match, $sort, $geonearв начале трубопровода), а также последующий $lookupи $graphLookupэтапах. После того, как данные были загружены в конвейер агрегации для обработки (например, проходя через такие этапы, как $project, $unwindи $group), дальнейшие манипуляции будут производиться в памяти (возможно, с использованием временных файлов, если allowDiskUseопция установлена).
Оптимизация трубопроводов
В целом конвейеры агрегации можно оптимизировать с помощью:
- Запуск конвейера с
$matchэтапом, чтобы ограничить обработку соответствующими документами.
- Обеспечение поддержки начальных
$match/ $sortэтапов с помощью эффективного индекса .
- Фильтрация данных в начале использования
$match, $limitи $skip.
- Минимизация ненужных этапов и манипуляций с документами (возможно, пересмотр вашей схемы, если требуется сложная гимнастика агрегирования).
- Воспользуйтесь преимуществами новых операторов агрегирования, если вы обновили свой сервер MongoDB. Например, в MongoDB 3.4 добавлено много новых этапов и выражений агрегирования, включая поддержку работы с массивами, строками и фасетами.
Существует также ряд оптимизаций конвейера агрегирования, которые автоматически выполняются в зависимости от версии вашего сервера MongoDB. Например, смежные этапы могут быть объединены и / или переупорядочены, чтобы улучшить выполнение, не влияя на выходные результаты.
Ограничения
Как и в MongoDB 3.4, explainопция Aggregation Framework предоставляет информацию о том, как обрабатывается конвейер, но не поддерживает такой же уровень детализации, как executionStatsрежим для find()запроса. Если вы сосредоточены на оптимизации начального выполнения запроса, вам, вероятно, будет полезно просмотреть эквивалентный find().explain()запрос с помощью executionStatsили allPlansExecutionмногословностью .
Есть несколько соответствующих запросов функций для просмотра / голосования в трекере проблем MongoDB относительно более подробной статистики выполнения, чтобы помочь оптимизировать / профилировать конвейеры агрегирования: