#mongodb #indexing
Вопрос:
db.collection("mycollection").createIndex(
{
prop1: "text",
prop2: -1
},
{
name: "someindex1",
partialFilterExpression: {
prop2: false
}
}
);
Мы создали этот индекс.
prop1
есть string
, prop2
есть boolean
. Что я хотел бы спросить, так это:
- Будет ли MongoDB использовать этот индекс, когда я буду искать, запрашивая только по
prop1
? Или мне нужно создать отдельный индекс только дляprop1
? - Поскольку
prop1
статических значений будет всего несколько, как вenum
типе данных, но в будущем к нему может быть добавлено больше возможных значений. Является лиtext
тип индекса хорошим выбором? Мне не нужны такие функции, как поиск в тексте или что-то в этом роде, это больше похожеenum
Комментарии:
1. 1. Да, это будет: docs.mongodb.com/manual/core/index-text/#compound-index . 2. какой смысл иметь индекс для поля с такой низкой селективностью? что такое поиск «в тексте», который вам не нужен? Вместо этого попробуйте перефразировать свой вопрос тем, что вам нужно из индекса. Индексы стоят дорого, особенно текстовые.
2. @AlexBlex Мне нужно проиндексировать некоторые данные по идентификатору их владельца (процесс микросервиса). В настоящее время запущено 6 процессов, каждый из которых обрабатывает данные и сохраняет их в mongodb, после перезапуска любого из них процесс должен загружать из mongo только данные, созданные этим процессом (по идентификатору владельца, который всегда является одним и тем же строковым значением).
Ответ №1:
Нет, этого не произойдет.
Индекс был построен с частичным фильтром, поэтому он будет содержать ключи только для документов, где prop2
значение false, поэтому этот индекс будет возвращать правильные результаты только при включении фильтрации запроса prop2:false
.
Например, если коллекция содержит 2 документа:
{ prop1: "value1", prop2: true },
{ prop1: "value1", prop2: false}
Индекс будет содержать один ключ: {"":"value1", "":false}
указание на второй документ.
Если вы запрашиваете {$text:{$search:"value1"}, prop2: false}
запрос, исполнитель запроса может использовать индекс для поиска единственного соответствующего документа.
Однако, если вы запросите {$text:{$search:"value1"}}
его, он должен вернуть оба документа. Поскольку индекс содержит только ключ для второго документа, если бы исполнитель запроса использовал индекс, его результаты были бы неверными.