1. 程式人生 > >Mongotemplate多種情景模糊查詢

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