Поиск без учета регистра в Mongo
Я использую нечувствительный к регистру поиск в Mongo, что-то похожее на https://stackoverflow.com/q/5500823/1028488.
ie я использую регулярное выражение с параметрами i. Но у меня возникли проблемы с ограничением регулярного выражения только этим словом, его выполнение больше похоже на "Like" в SQL
, например: если я использую запрос
{"SearchWord" : { '$regex' : 'win', $options: '-i' }}
, Он показывает мне результаты для win, window & winter. Как ограничить его jsut show win?
пробовал /^win$/
но его sayin недействителен формат JSON.... Пожалуйста, предложите способ.
спасибо заранее
5 ответов
можно использовать '$regex':'^win$'
или /^win$/i
(обратите внимание, нет цитаты на второй)
источник здесь : Regex в запросах с Mongo
можно использовать $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/
обновление: начиная с MongoDB 2.4 для этого будет использоваться "текстовый" индекс и полнотекстовый поисковый запрос. Вы можете прочитать о них здесь. Если использовать недавний MongoDB, подход ниже будет глупым и ненужным.
однако, если у вас есть MongoDB
> 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" }
обратите внимание,что нечувствительные к регистру запросы не используют индекс, поэтому может иметь смысл сделать поле в нижнем регистре, чтобы вы могли ускорить этот запрос.
Go здесь для получения дополнительной информации о RegularExpressions
использовать $strcasecmp. Структура агрегирования была введена в MongoDB 2.2. Вы можете использовать строковый оператор "$strcasecmp", чтобы сделать сравнение без учета регистра между строками. Это более рекомендуется и проще, чем с помощью regex.
вот официальный документ об операторе команды агрегации: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp .
для регистр децибел.пользователи.найти ({"name": { $regex : new RegExp ("Vi"," i")}})
для чувствительных к регистру децибел.пользователи.найти ({"name": "Vi"}) или дБ.пользователи.найти ({"email":"example@mail.com"})
поиск в таблице пользователей
name-это имя столбца и текст" Vi", который выполняется поиск