Пример:
> db.stuff.save({"foo":"bar"});
> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0
mongodb
case-insensitive
Люк Деннис
источник
источник
$caseSensitive: false
. См: docs.mongodb.org/manual/reference/operator/query/text/...$caseSensitive
по умолчанию уже false, и это не отвечает на вопрос, потому что он работает только с индексированными полями. OP искал сравнение строк без учета регистра.Ответы:
Вы могли бы использовать регулярное выражение .
В вашем примере это будет:
Я должен сказать, однако, возможно, вы могли бы просто уменьшить (или увеличить) значение на пути, а не нести дополнительные расходы каждый раз, когда вы их найдете. Очевидно, что это не сработает для имен людей и тому подобного, но, может быть, они используются как теги.
источник
ОБНОВИТЬ:
Первоначальный ответ устарел. Mongodb теперь поддерживает расширенный полнотекстовый поиск со многими функциями.
ОРИГИНАЛЬНЫЙ ОТВЕТ:
Следует отметить, что поиск с регистронезависимым регулярным выражением / i означает, что mongodb не может выполнять поиск по индексу, поэтому запросы к большим наборам данных могут занимать много времени.
Даже с небольшими наборами данных это не очень эффективно. Вы получаете гораздо больший удар по процессору, чем ваш запрос, что может стать проблемой, если вы пытаетесь достичь масштаба.
В качестве альтернативы вы можете сохранить заглавную копию и выполнить поиск по ней. Например, у меня есть таблица User с именем пользователя в смешанном регистре, но id является копией имени пользователя в верхнем регистре. Это гарантирует, что дублирование с учетом регистра невозможно (наличие «Foo» и «foo» не допускается), и я могу выполнить поиск по id = username.toUpperCase (), чтобы получить поиск имени пользователя без учета регистра.
Если у вас большое поле, такое как тело сообщения, дублирование данных, вероятно, не очень хороший вариант. Я считаю, что использование постороннего индексатора, такого как Apache Lucene, является лучшим вариантом в этом случае.
источник
username: 'bill'
сопоставленияBILL
илиBill
не запроса полнотекстового поиска, который также совпадал бы со словами в виде словbill
, таких какBills
иbilled
т. д.Если вам нужно создать регулярное выражение из переменной, это гораздо лучший способ сделать это: https://stackoverflow.com/a/10728069/309514
Затем вы можете сделать что-то вроде:
Преимущество в том, чтобы быть более программным, или вы можете получить повышение производительности, компилируя его заранее, если вы многократно его используете.
источник
new RegExp("^" + req.params.term.toLowerCase(), "i")
тоже отлично работаетИмейте в виду, что предыдущий пример:
будет вызывать все записи, содержащие бар будут соответствовать запросу (bar1, barxyz, openbar), это может быть очень опасно для поиска имени пользователя в функции аутентификации ...
Вам может понадобиться, чтобы он соответствовал только поисковому запросу, используя соответствующий синтаксис регулярного выражения, например:
См. Http://www.regular-expressions.info/ для получения справки по синтаксису регулярных выражений.
источник
Начиная с MongoDB 3.4, рекомендуемый способ выполнить быстрый поиск без учета регистра - использовать индекс без учета регистра .
Я лично написал одному из основателей, чтобы он работал, и он сделал это! Это был вопрос о JIRA с 2009 года , и многие просили эту функцию. Вот как это работает:
Индекс без учета регистра создается путем указания параметров сортировки с силой 1 или 2. Вы можете создать индекс без учета регистра, например:
Вы также можете указать параметры сортировки по умолчанию для каждой коллекции:
В любом случае, чтобы использовать индекс без учета регистра, вам нужно указать тот же порядок сортировки в
find
операции, которая использовалась при создании индекса или коллекции:Это вернет "Нью-Йорк", "Нью-Йорк", "Нью-Йорк" и т. Д.
Другие заметки
Ответы, предлагающие использовать полнотекстовый поиск, в этом случае неверны (и потенциально опасны ). Вопрос был о том , регистронезависимом запрос, например ,
username: 'bill'
согласованияBILL
илиBill
, а не полный текст поискового запроса, который будет также соответствовать стеблям словаbill
, напримерBills
, иbilled
т.д.Ответы, предлагающие использовать регулярные выражения, медленные, потому что даже с индексами документация гласит :
$regex
ответы также могут привести к риску ввода данных пользователем .источник
источник
TL; DR
Правильный способ сделать это в монго
Не используйте RegExp
Иди и используй встроенную индексацию mongodb, ищи
Шаг 1 :
Шаг 2 :
Необходимо создать индекс для любого поля TEXT, которое вы хотите найти, без индексации запрос будет очень медленным
шаг 3 :
источник
username: 'bill'
сопоставленияBILL
илиBill
не запроса полнотекстового поиска, который также совпадал бы со словами в виде словbill
, таких какBills
иbilled
т. д.источник
$existing = Users::masterFind('all', ['conditions' => ['traits.0.email' => ['$regex' => "^$value$", '$options' => 'i']]]);
Mongo (текущая версия 2.0.0) не позволяет выполнять поиск по индексированным полям без учета регистра - см. Их документацию . Для неиндексированных полей регулярные выражения, перечисленные в других ответах, должны подойти.
источник
При использовании запроса на основе Regex следует помнить одну очень важную вещь: когда вы делаете это для системы входа в систему, избегайте каждого символа, который вы ищете, и не забывайте операторы ^ и $. У Lodash есть хорошая функция для этого , если вы уже используете ее:
Зачем? Представьте, что пользователь вводит в
.*
качестве своего имени пользователя. Это будет соответствовать всем именам пользователей, позволяя войти в систему, просто угадав пароль любого пользователя.источник
Наилучший метод на выбранном вами языке: при создании обертки модели для ваших объектов, пусть ваш метод save () выполняет итерацию по набору полей, которые вы будете искать, и которые также проиндексированы; этот набор полей должен иметь строчные буквы, которые затем используются для поиска.
Каждый раз, когда объект сохраняется снова, свойства нижнего регистра проверяются и обновляются с учетом любых изменений основных свойств. Это позволит вам эффективно выполнять поиск, но при этом каждый раз будет скрывать дополнительную работу, необходимую для обновления полей lc.
Поля в нижнем регистре могут быть хранилищем объектов ключ: значение или просто именем поля с префиксом lc_. Я использую второй для упрощения запросов (глубокие запросы к объектам могут иногда сбивать с толку).
Примечание: вы хотите индексировать поля lc_, а не основные поля, на которых они основаны.
источник
Предположим, вы хотите выполнить поиск по «столбцу» в «Таблице» и хотите выполнить поиск без учета регистра. Лучший и эффективный способ, как показано ниже;
Приведенный выше код просто добавляет значение поиска в качестве RegEx и выполняет поиск с нечувствительными критериями, установленными с параметром «i».
Всего наилучшего.
источник
Используя Mongoose это сработало для меня:
источник
.toLowerCase()
избыточно, если вы указываете флаг без учета регистраi
?Структура агрегации была введена в mongodb 2.2. Вы можете использовать строковый оператор "$ strcasecmp" для сравнения строк без учета регистра. Это более рекомендуется и проще, чем использование регулярных выражений.
Вот официальный документ об операторе команды агрегации: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp .
источник
Вы можете использовать регистры без учета регистра :
В следующем примере создается коллекция без сопоставления по умолчанию, затем добавляется индекс в поле имени с сопоставлением без учета регистра. Международные компоненты для Unicode
Чтобы использовать индекс, запросы должны указывать одинаковое сопоставление.
или вы можете создать коллекцию с сопоставлением по умолчанию:
источник
db.users.createIndex( { name: 1 }, {collation: { locale: 'tr', strength: 2 } } )
Для поиска и экранирования переменной:
Выход из переменной защищает запрос от атак с помощью '. *' Или другого регулярного выражения.
спусковой-струнное регулярное выражение
источник
Используйте RegExp , в случае, если какие-либо другие варианты не работают для вас, RegExp является хорошим вариантом. Это делает строку нечувствительной к регистру.
использовать имя пользователя в запросах, а затем это сделано.
Я надеюсь, что это сработает и для вас. Всего наилучшего.
источник
Я создал простой Func для регистра без учета регистра, который я использую в своем фильтре.
Затем вы просто фильтруете поле следующим образом.
источник
Использование фильтра работает для меня в C #.
Он может даже использовать индекс, потому что я считаю, что методы вызываются после возврата, но я еще не проверял это.
Это также позволяет избежать проблемы
этот mongodb будет думать, что p.Title.ToLower () является свойством и не будет отображаться правильно.
источник
Для любого, кто использует Golang и хочет иметь полнотекстовый поиск с учетом регистра с помощью mongodb и библиотеки globalsign mgo godoc .
источник
Как вы можете видеть в документах mongo - начиная с версии 3.2
$text
индекс по умолчанию не учитывает регистр : https://docs.mongodb.com/manual/core/index-text/#text-index-case-insensitivityСоздайте текстовый индекс и используйте оператор $ text в своем запросе .
источник
username: 'bill'
сопоставленияBILL
илиBill
не запроса полнотекстового поиска, который также соответствовал бы основанным на словах в видеbill
, таких какBills
иbilled
т. д.Они были проверены на поиск строк
источник
Я столкнулся с подобной проблемой, и это то, что работает для меня:
источник
$regex
и$options
. Что ты нажал Ctrl + F?$regex
неэффективно и потенциально небезопасно, как я объяснил в своем редактировании этого другого ответа 2016 года . Нет ничего постыдного в удалении ответов, если они больше не служат сообществу!