2015-01-21 4 views
2

У меня есть совокупный запрос MongoDBальтернативного Монго совокупного запрос

db.collection.aggregate([ 
    {$match: {a: "a1", b: "b1"}},{$group: {...}}, 
    {$sort: {...}}, {$limit: {10}} 
]) 

У меня есть составной индекс на а и б, и запрос является быстрым.

Однако когда я меняю матч

$match: {$or: [{a: "a1", b: "b1"}, {a: "a2", b: "b2"}]} 

запрос становится довольно медленным, и он, кажется, не использовать какие-либо показатели.

Есть ли способ либо: 1) Переписать запрос для использования составного индекса (в виде одного запроса) или 2) Заставить его использовать индекс?

+0

, если вы определили ** db.coll.createIndex ({а: 1, б: 1}) **, ваш запрос будет использовать индекс соединения правильно – Disposer

+1

я так и думал, но это еще не то, что он говорит мне с объяснить. Он не использует индекс с $ или без него. – user2175783

+0

Можете ли вы опубликовать «объяснение» результатов вашего запроса и изменить свой код для включения в какие поля вы выполняете операцию «sort». – BatScream

ответ

0

Я бы попытался добавить шаг сортировки в начало агрегации, чтобы убедиться, что это заставляет использовать ваш индекс.

db.collection.aggregate([ 
    {$sort: {a:1, b:1}}, 
    {$match: {$or: [{a: "a1", b: "b1"}, {a: "a2", b: "b2"}]}}, 
    ... 
]) 
+0

Если размещение $ sort в начале конвейера может повлиять на выбранный индекс, это, конечно же, не результат, который вы хотите. Конвейер агрегации доступен только для доступа к индексу на самом первом этапе, поэтому любой последующий этап не может использовать индекс, а преимущества использования границ индекса теряются. '$ match' должен всегда быть первым этапом любого конвейера агрегации. –

+0

@ Neil-Lunn, приятно знать об индексации и $ match, но почему индексирование в вопросе не работает должным образом? – Disposer

+0

@Disposer Честно говоря, не знаю и, вероятно, будет тралить код tom завтра, чтобы узнать, почему. Это не способ его решить, и это все, что я помешал. –

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