Я использую подобные документы (на основе вопроса) для обсуждения:
{
_id: 1,
fld: "One",
arrayX: [ ObjectId("5e44f9ed221e963909537848"), ObjectId("5e44f9ed221e963909537849") ],
someID: ObjectId("5e44f9e7221e963909537845"),
timestamp: ISODate("2020-02-12T01:00:00.0Z")
}
Индексы:
Я создал два индекса , как упомянуто в сообщении с вопросом:
{ timestamp: 1 }
и { arrayX:1, someID:1, timestamp:1 }
Запрос:
db.test.find(
{
someID: ObjectId("5e44f9e7221e963909537845"),
arrayX: ObjectId("5e44f9ed221e963909537848")
}
).sort( { timestamp: 1 } )
В Выше запрос я не с использованием $elemMatch
. Фильтр запроса, использующий $elemMatch
с условием равенства одного поля , может быть записан без $elemMatch
. From $ elemMatch Условие одиночного запроса :
Если в выражении $ elemMatch указан один предикат запроса, $ elemMatch не требуется.
План запроса:
Я запустил запрос с explain
и обнаружил, что запрос использует индекс arrayX_1_someID_1_timestamp_1
. Индекс используется для фильтра , а также для операций sort запроса.
Пример плана:
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"arrayX" : 1,
"someID" : 1,
"timestamp" : 1
},
"indexName" : "arrayX_1_someID_1_timestamp_1",
...
IXSCAN указывает, что запрос использует индекс. Этап FETCH указывает, что документ извлекается для получения других сведений с использованием идентификатора индекса. Это означает, что как фильтр запроса, так и сортировка используют индекс. Чтобы узнать, что сортировка использует индекс, план не будет иметь этап SORT - как в этом случае.
Ссылка:
С Сортировать и не префиксное подмножество индекса :
Индекс может поддерживать операции сортировки на не префиксном подмножестве шаблона ключа индекса. Для этого запрос должен включать условия равенства для всех префиксных ключей, которые предшествуют ключам сортировки.