Mongotemplate多种情景模糊查询

Criteria类:它封装所有的语句,以方法的形式进行查询。

Query类:这是将语句进行封装或者添加排序之类的操作。

按照姓名精确查询

Query query = new Query();
query.addCriteria(Criteria.where("name").is(name));
按照姓名模糊查询

Pattern pattern=Pattern.compile("^.*"+pattern_name+".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("name").regex(pattern));
多条件查询

Query query = new Query();
query.addCriteria(Criteria.where("name").is(name));
query.addCriteria(Criteria.where("age").is(age));
或者另外一种写法

Criteria criteria = new Criteria();
criteria.and("name").is(name);
criteria.and("_id").is(new ObjectId(id));
Query query = new Query(criteria);
一个模糊关键字匹配多字段 

Pattern pattern=Pattern.compile("^.*"+pattern_name+".*$", Pattern.CASE_INSENSITIVE);
            criatira.orOperator(Criteria.where("name").regex(pattern),
                    Criteria.where("sex").regex(pattern),
                    Criteria.where("age").regex(pattern),
                    Criteria.where("class").regex(pattern));

/**
* 这里使用的正则表达式的方式
* 第二个参数Pattern.CASE_INSENSITIVE是对字符大小写不明感匹配
*/
Pattern pattern = Pattern.compile("^.*"+这里拼接你的查询条件字符串+".*$", Pattern.CASE_INSENSITIVE);
/**
* criteria.and().regex() 在这里是构建了一个模糊查询的条件,并且用 'and/or' 相连
* query.addCriteria 把条件封装起来
*/
query.addCriteria(criteria.and("这里填写你MongoDB集合中的key").regex(pattern));

在某个值之间的条件(类似于sql中的BETWEEN ... AND)
如果在这里,模仿精准查询,把 is() 方法换成 gt() 或 lt() ,然后运行,肯定会报错,具体的
错误信息我没有记录下来,大概意思就是同一个字段连续出现了两次
这里需要用到 andOperator 方法,如下
//大于方法
Criteria gt = Criteria.where("你MongoDB中的key").gt("你的条件");
//小于方法
Criteria lt = Criteria.where("你MongoDB中的key").lt("你的条件");
/**
  * new Criteria().andOperator(gt,lt) 把上面的大于和小于放在一起,注意上面两个key一定是一样的
  * andOperator() 这个方法就是关键的方法了,把同key的多个条件组在一起
  * 但是 andOperator() 有个很坑的地方就是,在一个query中只能出现一次
  * 如果你有很固定很明确的入参,那还好,直接调用一次 andOperator()
  * 如果是多个key需要多个条件,而且条件数量还是动态的,怕不是魔鬼吧...
  */
query.addCriteria(new Criteria().andOperator(gt,lt));

还可以这样写

//条件查询2,gte大于 lte小于

Criteria criteria1 = Criteria.where("timestamp").gte(startTime).lte(endTime+1000);

一个query中只能存在一个 andOperator() 方法的时候,就应该把思考方向放在如何
把不确定个数的 Criteria 对象放入一个 andOperator() 方法中,这里是把多个 Criteria 对象用
逗号分隔的,其实 andOperator() 方法还可以入参 Criteria[] 数组
定义数组的话,那么问题又来了,如何确定数组的长度...即使定义了一个 [1024] 这样长度的数组
那如果逻辑中还有 if 判断隔开了,那数组的下标如何保证连续不错误,于是就又定义了一个List<Criteria>
泛型集合,先往集合里面存,完事了后就把集合遍历放入数组,最后把数组入参到 andOperator() 方法
//定义一个泛型集合,类型为 Criteria
List<Criteria> criteriaList = new ArrayList<>();
//定义一个无长度的数组,类型为 Criteria
Criteria[] criteriaArray = {};
//往集合里面添加条件对象
if(你的逻辑){
    //大于方法
    Criteria gt = Criteria.where("你MongoDB中的key").gt("你的条件");
    //小于方法
    Criteria lt = Criteria.where("你MongoDB中的key").lt("你的条件");
    if(gt!=null && lt!=null){
        criteriaList.add(gt);
        criteriaList.add(lt);
    }else if(gt!=null){
        query.addCriteria(gt);
    }else if(lt!=null){
        query.addCriteria(lt);
    }
}
//是否有条件
if(criteriaList.size()>0){
    //把无长度的数组实例出来,长度就位集合的个数
    criteriaArray = new Criteria[criteriaList.size()];
    for(int i = 0 ; i < criteriaList.size() ; i++){
        //把集合中的条件对象全部存入数组中
        criteriaArray[i] = criteriaList.get(i);
    }
}
//最后把数组入参到 andOperator() 方法中
query.addCriteria(new Criteria().andOperator(criteriaArray));

https://blog.csdn.net/qq_41402200/article/details/82149110?utm_source=copy 

原文:https://blog.csdn.net/weixin_42227975/article/details/80533678

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mongoTemplate是Spring Data MongoDB提供的一个操作MongoDB数据库的工具类。它提供了一系列的方法来执行数据库的增删改查操作。 在mongoTemplate中进行模糊查询,可以使用正则表达式来匹配需要查询的字段。具体步骤如下: 1. 创建一个Query对象,用于设置查询条件。 2. 使用Criteria对象设置模糊查询条件,可以使用正则表达式来匹配需要查询的字段。 3. 调用mongoTemplate的find方法,传入Query对象和需要查询的实体类,执行查询操作。 下面是一个示例代码,演示如何在mongoTemplate中进行模糊查询: ```java import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; public class MongoTemplateExample { private MongoTemplate mongoTemplate; public List<User> findUsersByKeyword(String keyword) { Query query = new Query(); Criteria criteria = Criteria.where("name").regex(keyword, "i"); // i表示不区分大小写 query.addCriteria(criteria); return mongoTemplate.find(query, User.class); } } ``` 在上述示例中,我们通过`Criteria.where("name").regex(keyword, "i")`设置了一个模糊查询条件,其中"name"是需要查询的字段名,`regex(keyword, "i")`表示使用正则表达式进行匹配,"i"表示不区分大小写。 你可以根据自己的需求修改上述代码,来实现更复杂的模糊查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值