Да.
Чтобы понять, почему ответ да, нам нужно поговорить о том, как составные индексы фактически создаются.
Поля в составном индексе идут от первого до последнего со значениями всех детей, вложенных в родителей. Это означает, что если у вас были три таких документов, как:
[{
_id:{},
a: 1,
b: 2,
c: 3
},{
_id:{},
a: 4,
b: 5,
c: 6
},{
_id:{},
a: 7,
b: 8,
c: 9
}]
И сделал индекс на:
db.collection.ensureIndex({a:1,b:1,c:1})
Индекса будет Infact выглядеть примерно так: {1: [2,3]}
с первым значением является самым левым полем и два других являются значениями, которые происходят при этом наибольшем значении.
Конечно, это не так, как выглядит индекс, я просто сделал это, чтобы сделать его человеком доступным для всех. Чтобы узнать, как именно на самом деле сформирован индекс, вы можете посмотреть несколько презентаций, один из которых я считаю хорошим дефактором, чтобы всегда смотреть это: http://www.mongodb.com/presentations/storage-engine-internals на внутреннюю память.
Таким образом, это означает, что MongoDB работает, чтобы выбрать этот индекс с помощью метода префикса, в котором он будет говорить, что a
и a,b
префиксы к индексу, и он может использовать эти поля, чтобы извлечь все другие значения, необходимых из индекса.
Приставка таким образом означает, что индекс не будет работать, если вы запрашиваются:
db.collection.find({state:"NY",country:"YS"});
db.collection.find({state:"NY"});
db.collection.find({country:"YS"});
Хорошо отметить, что порядок в запросе не имеет значения. Вы можете сделать поля в запросе в любом порядке, где это важно, в ИНДЕКСЕ.
В любом случае, это простой пример того, почему запросы будут использовать этот единственный индекс.
Попробуйте использовать и объясните. Он должен сказать вам, если ваш запрос покрывается индексом. –
да, он должен обслуживать оба запроса –
Этот индекс не будет обслуживать ни один из запросов, ни один из них на самом деле потому, что индекс находится в корневом поле города и штата и страны, где, поскольку запрос находится в подполе метро – Sammaye