2017-02-09 4 views
0

Я хотел бы улучшить свой метод поиска, который должен быть нечувствительным к регистру. В моей настройке есть пять разных коллекций, и я хочу найти поле title. Также мне нужно получить частичные результаты (минимум 3 символа).MongoDB: Оптимизированный поиск нескольких коллекций

Пример

// Collection 1 
{ title: 'Sample' }, 
{ title: 'Another sample' } 
{ title: 'This is an example' } 

// Collection 2 
{ title: 'Something else' }, 
{ title: 'A sample document' } 
{ title: 'This is another example' } 
  1. Ample: Все документы, за исключением первого из 2-ой коллекции
  2. Sample: Первые два документа сбора 1 и второй из коллекции 2
  3. another : Второй сборник документов 1
  4. is: Не следует указывать Результат (< 3 символов)

До сих пор я сделал с этим

db.collection.find({ title: new RegExp(value, 'i') }).fetch() 

... для каждой коллекции и объединить результаты в один массив.

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

Итак, я перешел на полнотекстовый поиск. Я добавил индекс title и попытался это:

db.collection.find({ $text: { $search: value } }).count() 

Но тогда Samp даже не дает мне первый документ.

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

ответ

0

Это то, что MongoDB руководство говорит:

Для случая чувствительных регулярных запросов выражения, если индекс существует поля, то MongoDB соответствует регулярному выражению против значений индекса, который может быть быстрее, чем сканирование коллекции. Дальнейшая оптимизация может произойти, если регулярное выражение является «префиксом выражение», что означает, что все потенциальные совпадения начинаются с той же строки. Это позволяет MongoDB построить «диапазон» из этого префикса и соответствовать только этим значениям из индекса, который падает в этом диапазоне.

Регулярное выражение является «префиксным выражением», если оно начинается с каретки (^) или левого якоря (\ A), за которым следует строка простых символов . Например, regex /^abc.*/ будет оптимизирован путем сопоставления только со значениями из индекса, начинающегося с abc.

и это важно:

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

В вашем случае вы должны использовать ключевое слово $regex и использовать .* в вашем value вар.

db.collection.find({ $text: { $regex: value, options: 'i' } }).count() 

Для вашего последнего вопроса - я не вижу никакого другого решения, чем делать find на каждой коллекции, передавая результаты через .forEach и добавления результатов в тот же один массив/объект.

Смежные вопросы