Поиск без учета регистра в 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", который выполняется поиск