SpringMongo Регулярное поисковое выражение без учета регистра

Я пытаюсь выполнить поиск без учета регистра в Mongo. В основном я хочу совпадение строки без учета регистра. Я использую регулярное выражение. Вот мой код

Query query = new Query( Criteria.where(propName).regex(value.toString(), "i"));

Но приведенная выше доза не соответствует всей моей строке (строка иногда с пробелами). Он возвращает значения, даже если это подстрока.

Например: предположим, что моя коллекция имеет 2 значения «Счет» и «Статус счета». Он возвращает мне «счет», даже если мой поиск «статус счета». Он возвращает результаты, даже если есть подстрока строки, которую я ищу. за

Я пробовал Query query = new Query( Criteria.where(propName).is(value.toString()));

Но вышесказанное чувствительно к регистру. Может кто-нибудь помочь в этом.


person Droidme    schedule 31.07.2012    source источник


Ответы (2)


Регулярное выражение /^bill$/i будет соответствовать только «Биллу» без учета регистра.

Вот пример, показывающий это (в оболочке mongo):

> db.foo.insert({name: "Bill"});
> db.foo.insert({name: "Bill status"});
> db.foo.insert({name: "another Bill"});
> db.foo.find()
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" }
{ "_id" : ObjectId("5018e191a499db774b92bf26"), "name" : "Bill status" }
{ "_id" : ObjectId("5018e19ba499db774b92bf27"), "name" : "another Bill" }
> db.foo.find({name: /bill/i})
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" }
{ "_id" : ObjectId("5018e191a499db774b92bf26"), "name" : "Bill status" }
{ "_id" : ObjectId("5018e19ba499db774b92bf27"), "name" : "another Bill" }
> db.foo.find({name: /^bill$/i})
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" }

Однако запрос с регулярным выражением не будет использовать индекс, за исключением случаев, когда он имеет левый корень (т. е. имеет форму /^префикс/) и если не используется флаг без учета регистра i. Вы можете заплатить существенное снижение производительности за использование запроса, использующего индекс. Таким образом, в зависимости от вашего варианта использования, лучшей альтернативой может быть использование логики приложения каким-либо образом, например:

  1. Принудительный случай, когда вы вставляете элементы в базу данных (например, конвертируете «счет» в «счет»).

  2. Выполните поиск по известному делу (например, выполните поиск только по «Биллу»).

person Ian Daniel    schedule 01.08.2012
comment
спасибо, что нашли время ответить в обоих местах:). Я использую spring-mongo для взаимодействия с mongo db. Могу ли я использовать то же самое там? если да, можете ли вы сказать мне, как я могу изменить это в своем коде? Я попробовал i(/^value.tostring$) из приведенной выше команды, которую я использовал. спасибо - person Droidme; 01.08.2012
comment
@Droidme: ​​в качестве альтернативы spring-mongo вы можете взглянуть на Jongo. Текущая миссия Jongo — это Query в Java, как в оболочке Mongo. - person Stennie; 02.08.2012
comment
Я не являюсь разработчиком Spring-Mongo, однако предлагаю вам попробовать: Query query = new Query(Criteria.where(propName).regex(^ + value.toString() + $, i)); - person Ian Daniel; 02.08.2012

Нечувствительный поиск с использованием поиска по регулярным выражениям. input_location может быть Дели, Дели, ДЕЛИ, это работает для всех.

Criteria.where("location").regex( Pattern.compile(input_location, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE)));   
person Ajay Kumar    schedule 15.10.2014
comment
Что, если я просто хочу искать без учета регистра? Например, если я нахожу для male, я должен получить male и MALE, но я также получаю FEMALE, потому что он содержит мужской. - person Half Blood Prince; 18.07.2016