java, Morphia как сравнивать строки при использовании методов поиска Morphia

Я новичок в этом, так что вот.
Попытка получить пользователя по имени «Боб» из MongoDb.

У меня есть:

UserData ud = MonConMan.instance().getDb().find(UserData.class, "name","bob").get();

"Боб" не может быть найден, если в нем заглавная "Боб".
Я понимаю, что могу получить List и сделать equalsIgnoreCase, но
есть ли какие-нибудь операторы, которые я могу использовать?

У меня есть пользователи, входящие в систему, и я должен проверить, зарегистрированы ли они. Пользователь может вводить свое имя так, как ему нравится, поэтому он должен найти способ использовать equalsIgnoreCase. Да, это проблема, я не могу получить все имена и сделать equalsIgnoreCase, если их около 10 000. Можно, конечно, изначально сохранить все имена пользователей в нижнем регистре, но это разрушит внешний вид имени.

смотрю вики, но ничего не вижу..

http://code.google.com/p/morphia/wiki/Query


person Erik    schedule 23.09.2011    source источник


Ответы (3)


Используйте регулярное выражение Java, например.

String name = "bob";
Pattern pattern = Pattern.compile("^" + bob + "$", Pattern.CASE_INSENSITIVE);//This line will create a pattern to match words starts with "b", ends with "b" and its case insensitive too.

Query<UserData> query = createQuery().field("name").equal(pattern).retrievedFields(true, "id");//Replace `id` with what ever name you use in UserData for '_id'
UserData user = query.get();
if(user!=null){
  //he is already registered
}
else{
//He is  a new guy

}

(I am not good at regex, so you may have read about$&^somewhere. )

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

person Community    schedule 24.09.2011

Закончилось тем, что осталось два поля, такие как - lowercaseusername - originalusername

Таким образом, я мог бы искать пользователя, используя имя пользователя в нижнем регистре.

person Erik    schedule 05.07.2012
comment
По-видимому, это также будет иметь то преимущество, что он все равно попадет в индекс, в отличие от метода сопоставления с образцом (через: goo.gl /O23WfY) - person subdigit; 17.11.2013

Вы можете найти имя UserData, используя этот код:

Query<UserData> query = createQuery().filter("name","bob");
find(query);

В моем приложении этот код возвращает все UserData, у которых есть поле name со значением "bob". Код тоже может быть таким:

Query<UserData> query = createQuery().field("name").equal("bob");
find(query);

Эти коды будут в UserDataDao, который расширяет BasicDao и получает в конструкторе хранилище данных от morphia.

person Raduan Santos    schedule 23.09.2011
comment
Но что, если имя bob пишется как BoB , будет ли оно все равно возвращать all? - person Erik; 23.09.2011
comment
Вы можете использовать contains, чтобы привести все, что имеет часть имени. Пример: поле(имя).содержит(Bo); Но я не знаю, как он работает со вставками case Sensitive. - person Raduan Santos; 23.09.2011
comment
У меня есть пользователи, входящие в систему, и я должен проверить, зарегистрированы ли они. Пользователь может вводить свое имя так, как ему нравится, поэтому он должен найти способ использовать equalsIgnoreCase. Да, это проблема, я не могу получить все имена и сделать equalsIgnoreCase, если их около 10 000. - person Erik; 23.09.2011