за месяц * Последняя документация по группе , существует специальная оптимизация для $ first:
Оптимизация для возврата первого документа каждого Группа
Если конвейер сортирует и группирует по одному и тому же полю, а на этапе $ group используется только оператор $ first суммирующий, рассмотрите возможность добавления индекса к сгруппированному полю, соответствующего порядку сортировки. В некоторых случаях на этапе $ group можно использовать индекс для быстрого поиска первого документа каждой группы.
Это имеет смысл, поскольку для каждой ячейки должна быть только первая запись в упорядоченном индексе. в групповой стадии $. К сожалению, в моем тестировании я получил запрос, который обрабатывает ~ 800 тыс. Отсортированных записей примерно за 1 с, а затем передает их в $ group, где требуется около 10 с для вывода выходных документов 1,7 тыс. Для некоторых значений key
(см. пример ниже). Для других значений key
время ожидания составляет 300 с. В группе должно быть ровно 1704 бина, независимо от key
, и эти бины запроса должны охватываться первыми тремя записями в индексе, насколько я могу судить. Я что-то упустил?
db.getCollection('time_series').aggregate([
{
'$match': {
'organization_id': 1,
'key': 'waffle_count'
}
},
{
'$sort': {
'key': 1, 'asset_id': 1, 'date_time': - 1
}
},
{
'$group': {
'_id': {
'key': '$key', 'asset_id': '$asset_id'
},
'value': {
'$first': '$value'
}
}
}
]);
Вот индекс:
{
"organization_id": 1,
"key": 1,
"asset_id": 1,
"date_time": -1
}