我有以下系列:
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"}}]}'.
答案 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);
适用于所有搜索查询: