Поиск без учета регистра в Mongo

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

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

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

Я попробовал /^win$/, но он говорит, что JSON недействителен... Пожалуйста, откажитесь.

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


person Praneeta    schedule 23.11.2011    source источник


Ответы (5)


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

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

person Aurélien B    schedule 23.11.2011

Вы можете использовать $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/

person Somnath Muluk    schedule 28.11.2015
comment
По ошибке вы поместили пример строки «Содержит» внутри строки «Точно без учета регистра» и наоборот. Я отредактировал ваш ответ, поменяв местами примеры для этих двух случаев, а также исправив некоторые грамматические ошибки. - person gauravparmar; 16.02.2018
comment
@gauravparmar: Пожалуйста, проверьте и исправьте, если что-то не так. - person Somnath Muluk; 16.02.2018
comment
Я отредактировал ваш ответ, но он должен быть проверен экспертами, говорится в нем. - person gauravparmar; 16.02.2018

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

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

> 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" }

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

Перейдите здесь для получения дополнительной информации о регулярных выражениях.

person Tyler Brock    schedule 23.11.2011
comment
$text не заменяет регулярное выражение. Это довольно ограничительно и не позволит ему найти зиму в поисках победы. - person B T; 09.04.2016
comment
@BT Ты прав. Для этого нужно было бы хранить n-граммы и сопоставлять их. Нечеткий поиск с MongoDB и Python - person Rohmer; 28.03.2017
comment
Также: индексы без учета регистра - person Rohmer; 28.03.2017

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

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

person Jogue Wasin    schedule 20.05.2017

Для регистронезависимых

db.users.find({"name":{ $regex : new RegExp("Vi", "i") }})

Для чувствительного к регистру

db.users.find({"name":"Vi"})
// or
db.users.find({"email":"[email protected]"})

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

имя — это имя столбца и текст Vi, которые ищутся

person Vikas Kumar    schedule 20.11.2015