Поиск без учета регистра в Монго - PullRequest
51 голосов
/ 23 ноября 2011

Я использую поиск без учета регистра в Mongo, что-то похожее на https://stackoverflow.com/q/5500823/1028488.

, т.е. я использую регулярное выражение с параметрами i.Но у меня возникают проблемы с ограничением регулярного выражения только этим словом, оно выполняет больше похоже на 'Like' в SQL

, например: если я использую запрос как {"SearchWord" : { '$regex' : 'win', $options: '-i' }}, он показывает мне результаты для win, window &зима.Как мне ограничить его только показом выигрыша?

Я пытался /^win$/, но это говорит о недействительности Json .... Пожалуйста, предложите способ.

Заранее спасибо

Ответы [ 5 ]

91 голосов
/ 28 ноября 2015

Вы можете использовать $options => i для поиска без учета регистра.Приведите несколько возможных примеров, необходимых для совпадения строк.

Точный регистр не учитывается string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})

Содержит string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

Начните с string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})

Окончание string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})

Не содержит string

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})

Сохраните это как закладку и ссылку для любых других изменений.Вам может понадобиться.http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

49 голосов
/ 23 ноября 2011

Вы можете использовать '$regex':'^win$' или /^win$/i (обратите внимание на отсутствие кавычек на втором)

Источник здесь: Регулярное выражение в запросах с Mongo

19 голосов
/ 23 ноября 2011

ОБНОВЛЕНИЕ : Начиная с MongoDB 2.4, для этого использовался бы «текстовый» индекс и запрос полнотекстового поиска.Вы можете прочитать о них здесь .Если использовать недавнюю MongoDB, подход ниже будет глупым и ненужным.

Однако, если у вас MongoDB <2.4.0, вы можете использовать регулярное выражение, например: </p>

> db.reg.insert({searchword: "win"})
> db.reg.insert({searchword: "window"})
> db.reg.insert({searchword: "Win"})

> db.reg.find()
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e36dd68c9021e453d13"), "searchword" : "window" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

> db.reg.find({ searchword: /^win$/i })
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

Однако,ваша версия не работает, потому что вам не нужны символы "/" при использовании оператора $ regex:

> db.reg.find({ searchword: { $regex: "^win$", $options: '-i' }})
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

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

Перейдите здесь для получения дополнительной информации о RegularExpressions

0 голосов
/ 20 мая 2017

Используйте $ strcasecmp. Структура агрегации была представлена ​​в MongoDB 2.2. Вы можете использовать строковый оператор "$ strcasecmp" для сравнения строк без учета регистра. Это более рекомендовано и проще, чем использование регулярных выражений.

Вот официальный документ об операторе команды агрегирования: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp.

0 голосов
/ 20 ноября 2015

для регистра без учета регистра db.users.find ({"name": {$ regex: new RegExp ("Vi", "i")}})

для чувствительных к регистру db.users.find ({ "имя": "Vi"}) или же db.users.find ({ "электронная почта": "example@mail.com"})

поиск в таблице пользователей

name - это имя столбца и текст "Vi", в котором выполняется поиск

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