MongoDB& Spring Data - 按名字/姓氏搜索用户

时间:2015-05-20 08:05:08

标签: mongodb mongodb-query spring-data criteria-api database

我有以下系列:

User {
   firstname,
   lastname
}

我想按名字和/或姓氏(名字/姓氏/名字+姓氏)搜索用户。

我有什么:

 Criteria criteria = new Criteria();
 criteria.orOperator(Criteria.where("firstname").regex(searchQuery),Criteria.where("lastname").regex(searchQuery));

上述问题是我可以使用名字或姓氏进行搜索,但不能同时进行搜索(例如,'''''''''& #39; John'或#39;'史密斯'是可能的。 这是因为orOperator而发生的,我看不到任何orOr或类似的东西。

所以,例如如果我有" John Smith"在我的数据库中,我可以通过查询" John" ,"史密斯" ,"约翰史密斯" (就像在facebook中一样)

编辑:

String queryx[] = searchQuery.split(" ");
for(String q : queryx) {
    criteria.orOperator(Criteria.where("firstname").regex(searchQuery),Criteria.where("lastname").regex(q));
}

显示结果,但它在我的控制台中出现以下错误:

  Due to limitations of the com.mongodb.BasicDBObject, you can't add a second '$or' expression specified as '$or : [ { "firstname" : { "$regex" : "john smith"}} , { "lastname" : { "$regex" : "smith"}}]'. Criteria already contains '$or : [ { "firstname" : { "$regex" : "john smith"}} , { "lastname" : { "$regex" : "john"}}]'.

EDIT2:

String queryx[] = searchQuery.split(" ");
   ArrayList<Criteria> orOperators = new ArrayList<Criteria>();
for(String q : queryx) {
    Criteria criteria = new Criteria();
    criteria.orOperator(Criteria.where("firstname").regex(searchQuery),Criteria.where("lastname").regex(q));
    orOperators.add(criteria);
}

Criteria [] orArray = orOperators.toArray(new Criteria[orOperators.size()]);
Criteria c = Criteria.where("firstname").regex(searchQuery);
c.orOperator(orArray);

Query query = new Query(c).limit(limit);
return mongoOperations.find(query, User.class);

编辑3:

String queryx[] = searchQuery.split(" ");
ArrayList<Criteria> cr = new ArrayList<Criteria>();
for (String q : queryx) {
    Criteria criteria = new Criteria();
    criteria.orOperator(Criteria.where("firstname").regex(q),
            Criteria.where("lastname").regex(q));
    cr.add(criteria);
}

Query query = new Query();
for (Criteria cri : cr) {
    query.addCriteria(cri); //this is the problem
}

return mongoOperations.find(query, User.class);

错误:

 Due to limitations of the com.mongodb.BasicDBObject, you can't add a second 'null' criteria. Query already contains '{ "$or" : [ { "firstname" : { "$regex" : "john smith"}} , { "lastname" : { "$regex" : "john"}}]}'.

3 个答案:

答案 0 :(得分:3)

要搜索名字和姓氏,您可以轻松地执行此操作:

String queryx[] = searchQuery.split(" ");
ArrayList<Criteria> cr = new ArrayList<Criteria>();
for (String q : queryx) {
    Criteria fCriteria = Criteria.where("firstname").regex(q);
    cr.add(fCriteria);
    Criteria lCriteria = Criteria.where("lastname").regex(q);
    cr.add(lCriteria);
}
Criteria c = cr.remove(0);
Criteria [] orArray = orOperators.toArray(new Criteria[orOperators.size()]);
c.orOperator(orArray);
query.addCriteria(c); //this is the problem
return mongoOperations.find(query, User.class);

答案 1 :(得分:1)

我用过并成功了

List<Criteria> userNameCriteriaList = Lists.newArrayList();

for (String key: keyWords) {
    Criteria criteria = new Criteria();
    criteria.orOperator(
         where(FIRST_NAME).regex(regex, "i"),
         where(LAST_NAME).regex(regex, "i")
    );
    userNameCriteriaList.add(criteria);
}

return new Criteria().andOperator(userNameCriteriaList.toArray(new Criteria[0]));

答案 2 :(得分:0)

如果不使用条件,您只需在@TextIndexed'firstname' 'lastname'放置实体'User'并执行此操作:

@Query("{ $text: { $search: ?0 } }")
List<User> searchUsers(String search);

适用于所有搜索查询:

  • “john” 的
  • “john doe”
  • “doe john”
  • , “DOE”
相关问题