Начиная с 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 относительно более подробной статистики выполнения, чтобы помочь оптимизировать / профилировать конвейеры агрегирования: