2013-08-30 5 views
0

Из 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 } } } 
        ]); 

предполагая существует индекс, который охватывает дату и счет?

+0

Является ли это составным индексом, если это так, префикс остановит его от работы – Sammaye

+0

Предположим, ради обсуждения, что в коллекции есть индекс по дате и баллу по отдельности, а также дата + оценка –

+0

I woudl предположим, что не было никакой группы и т. д., что MongoDB должен использовать индекс для обоих, однако я на самом деле не уверен, как он запрограммирован таким образом, он может не обнаружить этого, это действительно действительно внутренне, конечно, последний запрос будет 100x лучше – Sammaye

ответ

3

Нет, MongoDB (начиная с версии 2.4.6) будет использовать индекс только для первого $match в вашем конвейере.

Для второго запроса агрегирования, который вы опубликовали, до тех пор, пока у вас есть составной индекс на дату и счет, этот индекс будет использоваться для запроса. Это должно работать лучше, чем ваш первый запрос.

+0

Изменилось ли это в версии 2.6? А также, если у вас есть два соответствия друг за другом в конвейере, например '[{$ match: {x: ...}}, {$ match: {y: ...}}]' и у вас есть два отдельных индексы по x и y (и вы не можете иметь составной индекс для x и y, потому что x - это, скажем, индекс с несколькими ключами, а y - текстовый индекс), может MongoDB использовать другой индекс для другого $ match стадии в трубопроводе? – cwarny

Смежные вопросы