当前位置: 首页 > 知识库问答 >
问题:

MongoDB和Spring数据-按名字/名字搜索用户

焦博实
2023-03-14

我有以下收藏:

User {
   firstname,
   lastname
}

我想通过firstname和/或lastname搜索用户(firstname/lastname/firstname+lastname)。

 Criteria criteria = new Criteria();
 criteria.orOperator(Criteria.where("firstname").regex(searchQuery),Criteria.where("lastname").regex(searchQuery));
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"}}]'.
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"}}]}'.

共有1个答案

贝阳泽
2023-03-14

要搜索firstname和lastname,可以轻松地执行以下操作:

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);
 类似资料:
  • 我有两个字段FirstName和LastName存储在MongoDB中。从前端,我接收到一个字符串,包含名字和姓氏,用空格分隔,我需要一个查找查询,搜索名字和姓氏的组合。

  • 我使用的是Spring数据jpa,MySQL。我有以下实体 Mysql表如下所示, 我想搜索所有

  • 我正在尝试使用查询搜索出生日期 我如何才能搜索dob在等位日期格式?

  • 我有一个集合与几个字段,并希望通过Java程序更新这两个字段名称。例如: 现在我需要将field1重命名为field11。我如何使用spring数据来做。 基本上使用Java https://docs.mongodb.com/manual/reference/operator/update/rename/

  • 我有一个ISODate格式的“DateAdd”Mongo集合 所以现在是当地时间1小时后 当我尝试获取2018-08-31 06:00:00之后添加的记录时,使用以下查询,我无法获取UTC中的记录 在MongoDB中搜索日期字段时,如何转换UTC日期?

  • 我在使用Java搜索MongoDB中的ISODate字段时遇到麻烦。我想找到精确匹配的日期。 下面是我如何查询第一个集合并获取ISODate字段“Timestamp”。一旦我得到这个日期,我想搜索另一个具有相同“Timestamp”值的集合。 。。。 我正在格式化ISODate,因为它以我想要搜索的不同格式返回我的日期。因此,我将其转换为这种模式“yyyy-MM-dd HH: mm: ss” 我找