Что мне делать, если мне нужно более одного текстового индекса в коллекции MongoDB?

#mongodb #database-indexes

#mongodb #база данных-индексы

Вопрос:

Моя коллекция, названная Messages в MongoDB, содержит множество сообщений с содержимым сообщений и метаданными. Каждое сообщение имеет идентификатор Sender и Recipient идентификатор в формате UUID , который, в свою очередь, является a string . Существуют варианты использования, когда мне нужно запрашивать оба Sender и Recipient с одним и тем же UUID , или только Sender или только Recipient с a UUID , или оба с разными UUID s .

Я создал текстовый индекс для первого случая, который работает довольно хорошо, но мне нужно эффективно искать и в других случаях. Что бы вы предложили? Что я должен настроить / изменить? Я не могу определить какой-либо другой текстовый индекс в той же коллекции, потому что на данный момент существует ограничение на количество текстовых индексов в MongoDB.

Примечание: сначала я не знал о текстовых индексах и пытался создать обычные индексы, но они просто вообще не используются запросами, и даже если я заставляю их использовать, запросы все равно сканируют все документы, что бесполезно.

Комментарии:

1. Здесь вам вообще не нужен текстовый индекс. Это для полнотекстового поиска. Вам нужен обычный индекс.

2. обычные индексы не используются при запросе в соответствии с анализом выполнения.

3. Это звучит маловероятно. Может быть, настроить игровую площадку mongo , которая демонстрирует такое поведение?

4. Я пытался, но не смог создать индекс странным образом. mongoplayground.net/p/OnjLE72UMmr

Ответ №1:

Согласно игровой площадке, вам нужно использовать это для создания индекса.

Именно по этой причине он не использовал индекс.

 db.Message.createIndex({
  "Sender._id": 1
})
 

У вас также может быть другой индекс Recipient._id . На основе вашего запроса он будет использовать индекс.

Я имею в виду, когда у вас есть два отдельных индекса, т.Е. Один включен Sender_id , другой включен Recipient._id , и при запросе будет использоваться соответствующий индекс.

И ваш вариант использования — это не полнотекстовый поиск, поэтому не используйте для этого текстовый индекс.

Комментарии:

1. Извините, но я все еще не могу создать индекс. mongoplayground.net/p/xgVPLSTiSh_

2. Похоже, что существует специальный синтаксис для создания коллекции с индексами в mongoplayground. Смотрите раскрывающийся список «шаблон» в верхней панели. @schlingel

3. Ну ладно, неважно. Похоже, вы не можете создавать свои собственные данные и индексы в mongoplayground.

4. нет, я использовал специальный синтаксис и создал индекс, но в плане выполнения по-прежнему указано, что он использовал «collspan»: mongoplayground.net/p/KGD8CGr1pkc

5. @schlingel: ваш запрос был неправильным. Должно быть так . Я также пытался изменить определение вашего индекса, но mongoplayground по-прежнему, похоже, не создает правильные индексы (возможно, он может создавать только текстовые индексы? : пожатие плечами:). Это сработало на моем локальном хосте (план выполнения показывает IXSCAN)