Из MongoDB docs:
Поместите $ матч, как в начале агрегации трубопровода, как это возможно. Поскольку $ match ограничивает общее количество документов в конвейере агрегации, более ранние операции $ match минимизируют объем обработки вниз по трубе.
Если вы поместите совпадение $ в самом начале конвейера, запрос может использовать индексы, подобные любым другим db.collection.find() или db.collection.findOne().
Учитывая то запрос
db.articles.aggregate([
{ $match : {date : {$gt: now, $lte: later } } },
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
]);
где (конечно), в настоящее время, а затем представляют правильно отформатированные даты,
бы рамки агрегации использовать индекс для второго матча (если он доступен), или это только первое совпадение в конвейере агрегации, пригодном для использования индекса.
ли запрос будет работать лучше, как:
db.articles.aggregate([
{ $match : {date : {$gt: now, $lte: later }, score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
]);
предполагая существует индекс, который охватывает дату и счет?
Является ли это составным индексом, если это так, префикс остановит его от работы – Sammaye
Предположим, ради обсуждения, что в коллекции есть индекс по дате и баллу по отдельности, а также дата + оценка –
I woudl предположим, что не было никакой группы и т. д., что MongoDB должен использовать индекс для обоих, однако я на самом деле не уверен, как он запрограммирован таким образом, он может не обнаружить этого, это действительно действительно внутренне, конечно, последний запрос будет 100x лучше – Sammaye