Совпадение любых слов или части слова в поле в mongodb - PullRequest
0 голосов
/ 09 мая 2018

Я использую MongoDB и Mongoid ODM для MongoDB в Rails. У меня есть поле с именем name, и одним из значений имени документа является «John Paul Smith». Так, например:

{"_id": ObjectId ("582bab8f9f26631b8a000088"), "name": "ДЖОН ПОЛ СМИТ "," электронная почта ":" "," факс ":" ", ...

Я хочу найти этот документ с ключевым словом "Джон Смит". Теперь, если я ищу с "ДЖОН ПОЛ СМИТ", это работает:

Contact.where(name: " John Paul Smith").first
# => #<Contact _id: 582fab8d9f26631605000054, created_at: 2016-11-19 01:31:57 UTC, ...

Но если я буду искать по имени и фамилии, это не даст результатов:

 Contact.where(name: "John Smith").first
# => nil 

Он должен выдавать результат, даже если я ищу по имени и только по части фамилии, например:

Contact.where(name: "John Smith").first

В настоящее время я использую следующий поиск:

Contact.where({name: /.*#{condition}.*/i })

И он не делает то, что я хочу, как я описал выше. Как я могу найти поле по имени и фамилии или имени и части фамилии или части имени или имени и отчества? (Я принимаю решение либо в MongoDB, либо в Mongoid. Мне не обязательно нужно решение Mongoid. Я могу преобразовать решение MongoDB в Mongoid.)

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете использовать $ regex из monogDB.

Collection.where(name: {'$regex': params[:search], '$options': 'i'})

вернет все данные, похожие на строку имени.

0 голосов
/ 10 мая 2018

Не очень хорошее решение, но оно работает:

condition = "John Smith"
regex = '^(?=.*' + condition.split(/\s+/).map{ |x| Regexp.quote(x) }.join(')(?=.*') + ')'
@contacts = Contact.where({name: /#{regex}/i })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...