Нечувствительный к регистру поиск в Монго

Я использую нечувствительный к регистру поиск в Mongo, что-то похожее на qaru.site/info/22996/....

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

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

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

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

Ответы

Ответ 2

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

Ответ 3

ОБНОВЛЕНИЕ. По состоянию на 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" }

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

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

Ответ 4

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

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

Ответ 5

Для нечувствительных к регистру db.users.find({ "name": {$ regex: новый RegExp ( "Vi" , "i" )}})

Для чувствительных к регистру db.users.find({ "имя": "Vi" }) или db.users.find({ "электронная почта": "[email protected]" })

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

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