Ответ 1
Вы можете использовать '$regex':'^win$'
или /^win$/i
(не замечайте никаких котировок на втором)
Источник здесь: Регулярное выражение в запросах с Mongo
Я использую нечувствительный к регистру поиск в Mongo, что-то похожее на qaru.site/info/22996/....
т.е. я использую регулярное выражение с опциями i. Но мне трудно ограничивать регулярное выражение только этим словом, оно больше похоже на "Like" в SQL
например: если я использую запрос как
{"SearchWord" : { '$regex' : 'win', $options: '-i' }}
, он показывает мне результаты для победы, окна и зимы. Как я могу ограничить его победой jsut show?
Я пробовал /^win$/
, но его sayin недействительный Json.... Пожалуйста, предложите способ.
Заранее спасибо
Вы можете использовать '$regex':'^win$'
или /^win$/i
(не замечайте никаких котировок на втором)
Источник здесь: Регулярное выражение в запросах с 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 < 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
Используйте $strcasecmp. Структура агрегации была введена в MongoDB 2.2. Вы можете использовать строковый оператор "$ strcasecmp", чтобы сделать нечувствительное к регистру сравнение строк. Это более рекомендуется и проще, чем при использовании регулярного выражения.
Здесь официальный документ оператора оператора агрегации: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp.
Для нечувствительных к регистру db.users.find({ "name": {$ regex: новый RegExp ( "Vi" , "i" )}})
Для чувствительных к регистру db.users.find({ "имя": "Vi" }) или db.users.find({ "электронная почта": "[email protected]" })
поиск в таблице пользователя
name - это имя столбца и текст "Vi" , которые просматриваются