Оптимизация запросов в MongoDB - PullRequest
0 голосов
/ 10 июня 2019

У меня есть две коллекции. В одной коллекции я сохранил строки поиска, в то время как в других есть фактические данные. Мне нужно найти записи из коллекции данных на основе строк поиска, хранящихся в коллекции поиска.

(1) Поиск в коллекции:


     [{_id:123, search: paris}, <br/>
    {_id:123, search: london}, <br/>
    {_id:123, search: tokyo}] <br/>

(2) Сбор данных:


     [{_id:123, content: Paris is capital of France}, <br/>
    {_id:123, content: Have you ever went to London?}, <br/>
    {_id:123, content: Where is Tokyo?}, <br/>
{_id:123, content: I heard about Singapore as well}]

Проблема в том, что у меня более 50 строк поиска, а при сборе данных у меня миллионы записей. Моя текущая реализация выглядит следующим образом:


 const src = await SearchCollection.find();<br/>

  for (let i = 0; i (is less than) src.length; i++) { <br/>
    let msg = await DataCollection.find({ <br/>

          content: { <br/>
            $regex: new RegExp(src[i].search)), <br/>
            $options: "gi" <br/>
          } <br/>

    }); <br/>

Очевидно, что этот запрос очень медленный. Если имеется 50 строк поиска, он будет циклически повторяться 50 раз, а также содержимое данных исчисляется миллионами. Как бороться с моим текущим сценарием?

1 Ответ

0 голосов
/ 11 июня 2019

Создайте текстовый индекс в поле content и используйте текстовый поиск.

db.text.insertMany([
  { "_id" : 1, "content" : "Paris is capital of France" },
  { "_id" : 2, "content" : "Have you ever went to London?" },
  { "_id" : 3, "content" : "Where is Tokyo?" },
  { "_id" : 4, "content" : "I heard about Singapore as well" }
])
db.text.createIndex({content:"text"})
db.text.find({$text:{$search:"London"}})

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

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...