Составной индекс и запрос одним его компонентом

#mongodb #indexing

Вопрос:

 db.collection("mycollection").createIndex(
        {
            prop1:   "text",
            prop2:   -1
        },
        {
            name:   "someindex1",

            partialFilterExpression: {
                prop2: false
            }
        }
);
 

Мы создали этот индекс.

prop1 есть string , prop2 есть boolean . Что я хотел бы спросить, так это:

  1. Будет ли MongoDB использовать этот индекс, когда я буду искать, запрашивая только по prop1 ? Или мне нужно создать отдельный индекс только для prop1 ?
  2. Поскольку 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"}} его, он должен вернуть оба документа. Поскольку индекс содержит только ключ для второго документа, если бы исполнитель запроса использовал индекс, его результаты были бы неверными.