最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于?MongoTemplate實現(xiàn)MongoDB的復雜查詢功能

 更新時間:2024年12月04日 08:55:18   作者:算死草  
本文介紹了如何使用MongoTemplate進行復雜的MongoDB查詢,展示了如何進行分頁和排序查詢,通過示例代碼,展示了如何處理不同類型的查詢,如單條件查詢、模糊查詢、組合條件查詢以及分頁排序查詢,感興趣的朋友跟隨小編一起看看吧

MongoDB是典型的非關系型數(shù)據(jù)庫,但是它的功能越來越復雜,很多項目中,我們?yōu)榱丝焖偻卣?,甚至直接使用Mongo 來替代傳統(tǒng)DB做數(shù)據(jù)持久化。
雖然MongoDB在支持具體業(yè)務時沒有問題,但是由于它是文檔型數(shù)據(jù)庫,擁有一套獨立的語法,不再支持傳統(tǒng)的SQL。
開發(fā)人員發(fā)現(xiàn)在實際開發(fā)過程中,由于語法問題,在處理復雜的業(yè)務查詢時,不知該如何下手,使不上勁。
在這里我總結了一下接觸到的使用場景:
如果是簡單的業(yè)務,那么我們直接使用spring JPA來實現(xiàn)就可以,比如這些操作:
1、創(chuàng)建
2、刪除
3、修改
4、簡單的查詢
因為這些語句的邏輯往往不是很復雜,JPA完全可以勝任,而且還清晰直觀。
如果是復雜的場景,我們就使用MongoTemplate 來組織條件邏輯:
假設背景是有張Student 表,結構如下:
我們已經(jīng)預先插入了下邊的數(shù)據(jù):

(1)先來一個簡單的單條件查詢:

private void simpleInQuery() {
         Query query = new Query();
         query.addCriteria(Criteria.where("classNo").ne(2));
         List<Student> students = mongoTemplate.find(query, Student.class);
         log.warn("the query result is: {}", students);
     }

輸出如下:

14:39:19.805  WARN 83348 --- [           main] c.e.demo.learn.mongo.MongodbController   : the query result is: 
[Student(_id=674d8125bf8e9e35bbc08718, name=xiaoa, description=good1, classNo=1, age=15), 
Student(_id=674d8125bf8e9e35bbc08719, name=xiaob, description=good2, classNo=1, age=13), 
Student(_id=674d8125bf8e9e35bbc0871a, name=xiaoc, description=good3, classNo=1, age=15),Student(_id=674d8125bf8e9e35bbc0871b, name=xiaod, description=good4, classNo=1, age=15), 
Student(_id=674d8153c993425aaa5c4fec, name=zhongd, description=perfect2, classNo=3, age=15), 
Student(_id=674d81dc8130705614f23311, name=biga, description=nice, classNo=3, age=15), 
Student(_id=674d81dd8130705614f23312, name=bigb, description=nice, classNo=3, age=13), 
Student(_id=674d81dd8130705614f23313, name=bigc, description=nice, classNo=3, age=15), 
Student(_id=674d81dd8130705614f23314, name=bigd, description=nice, classNo=3, age=15)]

觀察代碼,我們發(fā)現(xiàn)需要首先創(chuàng)建一個Query 實例,表示是一個查詢動作。query 對象,繼續(xù)補充一個Criteria 實例。Criteria 英[kra?'t??ri?] 譯為比標準、準則、尺度。我們可以直接理解為查詢條件。注意Criteria 實例是由 Criteria.where 方法創(chuàng)建出來的。(防盜連接:本文首發(fā)自http://www.cnblogs.com/jilodream/ )這是一個簡單工廠,參數(shù)為要查詢的表的列名(文檔的字段)。再跟一個in() ,表示列的in 操作,in() 中跟的是in操作的值。最后直接用mongoTemplate 實例執(zhí)行find 操作就好,條件為查詢邏輯和表對應的類文件。我們這里使用的是in 操作,除此之外,常用的還有

方法作用類比sql
gt表示 大于>
gte表示 大于等于 >=
lt 表示 小于<
lte 表示 小于等于 <=
ne 表示 不等于 !=
nin 表示 不屬于 not in
is 表示等于 =

regex

 表示 like (注意后面跟正則表達式,如 "^.*" + queryKeyWord + ".*$")like ‘%關鍵字%’

這些都是基本操作,有sql經(jīng)驗的同學肯定明白具體怎么使用。
我們再補充一個模糊查詢的例子:

private void simpleRegexQuery() {
        Query query = new Query();
        String queryKeyWord = "ong";
        query.addCriteria(Criteria.where("name").regex("^.*" + queryKeyWord + ".*$"));
        List<Student> students = mongoTemplate.find(query, Student.class);
        log.warn("the query result is: {}", students);
    }

輸出如下:

2024-12-03 14:46:23.781  WARN 81708 --- [           main] c.e.demo.learn.mongo.MongodbController   : the query result is: 
[Student(_id=674d8152c993425aaa5c4fe9, name=zhonga, description=perfect2, classNo=2, age=15), 
Student(_id=674d8153c993425aaa5c4fea, name=zhongb, description=perfect2, classNo=2, age=13), 
Student(_id=674d8153c993425aaa5c4feb, name=zhongc, description=perfect2, classNo=2, age=15), 
Student(_id=674d8153c993425aaa5c4fec, name=zhongd, description=perfect2, classNo=3, age=15)]

(2)接著來看一個相對復雜點的組合條件:兩個或條件,類似于SQL中的: A表達式 OR B表達式,代碼如下

private void simpleOrQuery() {
        Query query = new Query();
        String queryKeyWord = "ong";
        Criteria neCri = Criteria.where("age").ne(15);
        Criteria regexCri = Criteria.where("name").regex("^.*" + queryKeyWord + ".*$");
        Criteria orCri = new Criteria().orOperator(neCri, regexCri);
        query.addCriteria(orCri);
        List<Student> students = mongoTemplate.find(query, Student.class);
        log.warn("the query result is: {}", students);
    }

執(zhí)行效果如下:

2024-12-03 14:48:28.787  WARN 83804 --- [           main] c.e.demo.learn.mongo.MongodbController   : the query result is: 
[Student(_id=674d8125bf8e9e35bbc08719, name=xiaob, description=good2, classNo=1, age=13), 
Student(_id=674d8152c993425aaa5c4fe9, name=zhonga, description=perfect2, classNo=2, age=15), 
Student(_id=674d8153c993425aaa5c4fea, name=zhongb, description=perfect2, classNo=2, age=13),
 Student(_id=674d8153c993425aaa5c4feb, name=zhongc, description=perfect2, classNo=2, age=15), 
Student(_id=674d8153c993425aaa5c4fec, name=zhongd, description=perfect2, classNo=3, age=15), 
Student(_id=674d81dd8130705614f23312, name=bigb, description=nice, classNo=3, age=13)]

我們創(chuàng)建好兩個Criteria的簡單條件之后,再創(chuàng)建一個新的Criteria 實例,用一個or操作將二者關聯(lián)起來.
query 接收最新的Criteria 實例,然后執(zhí)行查詢即可。
這里的寫法類似于sql中的
where name like "%ong%" or age != 15

如果是兩個AND 條件,類似于SQL中的: (防盜連接:本文首發(fā)自http://www.cnblogs.com/jilodream/ )A表達式 AND B表達式,用法和or的使用方法是一樣的 。這里就不舉例了,
我們這里寫一個復雜的用法:

private void complexQuery() {
        Query query = new Query();
        String queryKeyWord = "ong";
        Criteria ageCri = Criteria.where("age").ne(15);
        Criteria nameCri = Criteria.where("name").regex("^.*" + queryKeyWord + ".*$");
        Criteria cri1 = new Criteria().orOperator(ageCri, nameCri);
        Criteria descCri = Criteria.where("description").is("nice");
        Criteria classNoCri = Criteria.where("classNo").in(1, 2, 3);
        Criteria cri2 = new Criteria().andOperator(descCri, classNoCri);
        query.addCriteria(new Criteria().orOperator(cri1, cri2));
        List<Student> students = mongoTemplate.find(query, Student.class);
        log.warn("the query result is: {}", students);
    }

輸出如下:

2024-12-03 14:51:46.908  WARN 92840 --- [           main] c.e.demo.learn.mongo.MongodbController   : the query result is: 
[Student(_id=674d8125bf8e9e35bbc08719, name=xiaob, description=good2, classNo=1, age=13), 
Student(_id=674d8152c993425aaa5c4fe9, name=zhonga, description=perfect2, classNo=2, age=15), 
Student(_id=674d8153c993425aaa5c4fea, name=zhongb, description=perfect2, classNo=2, age=13), 
Student(_id=674d8153c993425aaa5c4feb, name=zhongc, description=perfect2, classNo=2, age=15), 
Student(_id=674d8153c993425aaa5c4fec, name=zhongd, description=perfect2, classNo=3, age=15), 
Student(_id=674d81dc8130705614f23311, name=biga, description=nice, classNo=3, age=15), 
Student(_id=674d81dd8130705614f23312, name=bigb, description=nice, classNo=3, age=13), 
Student(_id=674d81dd8130705614f23313, name=bigc, description=nice, classNo=3, age=15),
 Student(_id=674d81dd8130705614f23314, name=bigd, description=nice, classNo=3, age=15)](防盜連接:本文首發(fā)自http://www.cnblogs.com/jilodream/ )

這里的寫法類似于sql中的

where ( description = "nice" and classNo in (1 ,2 ,3) ) or ("name like %ong%" or age != 15)

總體來看:一個Criteria 實例,就是一個查詢條件。

我們可以通過 or、and 操作來不斷的組合生成一個新的Criteria實例,也就是一個新的查詢條件 ,并且可以以此查詢條件繼續(xù)組合生成更高級的Criteria,以此不斷的類推。

這個過程就像壘積木一樣:

(3) 接著我們整合下分頁功能,并且以班級排序

PageRequest pageable = PageRequest.of(pageIndex - 1, pageSize);
Query pageQuery=query.with(pageable).with(Sort.by(Sort.Direction.DESC,"classNo"));

注意分頁時,頁碼數(shù)是從0開始,所以要-1。同時排序使用Sort生成sort的對象,包含排序方式和字段,并且這里支持多級排序。

整體代碼如下:

private void complexPageQuery() {
        int pageIndex=2;
        int pageSize=3;
        Query query = new Query();
        String queryKeyWord = "ong";
        Criteria ageCri = Criteria.where("age").ne(15);
        Criteria nameCri = Criteria.where("name").regex("^.*" + queryKeyWord + ".*$");
        Criteria cri1 = new Criteria().orOperator(ageCri, nameCri);
        Criteria descCri = Criteria.where("description").is("nice");
        Criteria classNoCri = Criteria.where("classNo").in(1, 2, 3);
        Criteria cri2 = new Criteria().andOperator(descCri, classNoCri);
        query.addCriteria(new Criteria().orOperator(cri1, cri2));
        long allDataSize = mongoTemplate.count(query, Student.class);
        PageRequest pageable = PageRequest.of(pageIndex - 1, pageSize);
        Query pageQuery=query.with(pageable).with(Sort.by(Sort.Direction.DESC,"classNo"));
        List<Student> students = mongoTemplate.find(pageQuery, Student.class);
        log.warn("the query result is: {}", students);
    }

輸出如下:

2024-12-03 14:56:46.059  WARN 18516 --- [           main] c.e.demo.learn.mongo.MongodbController   : the query result is: 
[Student(_id=674d81dd8130705614f23314, name=bigd, description=nice, classNo=3, age=15),
 Student(_id=674d81dc8130705614f23311, name=biga, description=nice, classNo=3, age=15), 
Student(_id=674d8152c993425aaa5c4fe9, name=zhonga, description=perfect2, classNo=2, age=15)]

到此這篇關于基于 MongoTemplate 實現(xiàn)MongoDB的復雜查詢的文章就介紹到這了,更多相關基于 MongoTemplate 實現(xiàn)MongoDB的復雜查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mongodb啟動命令參數(shù)中文說明

    Mongodb啟動命令參數(shù)中文說明

    這篇文章主要介紹了Mongodb啟動命令參數(shù)中文說明,本文包括基本配置、主/從參數(shù)、Sharding(分片)選項等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 優(yōu)化MongoDB配置來提高CPU使用率

    優(yōu)化MongoDB配置來提高CPU使用率

    MongoDB作為NoSQL數(shù)據(jù)庫的一種,已經(jīng)成為新一代數(shù)據(jù)存儲系統(tǒng)的趨勢,然而,MongoDB數(shù)據(jù)服務的性能問題一直是亟待解決的關鍵問題之一,在許多基于MongoDB的利用中,CPU利用率是一個重要的指標,它可以幫助我們對服務器的性能進行實時監(jiān)控,以便及時發(fā)現(xiàn)和修復效力瓶頸
    2024-01-01
  • ?PostgreSQL?與MongoDB使用對比分析

    ?PostgreSQL?與MongoDB使用對比分析

    這篇文章主要介紹了為什么?PostgreSQL?能代替?MongoDB?,需要的朋友可以參考下
    2023-12-12
  • mongodb 3.4下遠程連接認證失敗的解決方法

    mongodb 3.4下遠程連接認證失敗的解決方法

    這篇文章主要給大家介紹了在mongodb 3.4下遠程連接認證失敗的解決方法,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-06-06
  • 深究從MongoDB的ObjectId中獲取時間信息

    深究從MongoDB的ObjectId中獲取時間信息

    MongoDB默認使用_id字段作為主鍵,類型為ObjectId。ObjectId的生成有一定的規(guī)則,詳情可以查看這篇文章MongoDB深究之ObjectId
    2017-03-03
  • MongoDB 導出導入備份恢復數(shù)據(jù)詳解及實例

    MongoDB 導出導入備份恢復數(shù)據(jù)詳解及實例

    這篇文章主要介紹了MongoDB 導出導入備份恢復數(shù)據(jù)詳解及實例的相關資料,需要的朋友可以參考下
    2016-10-10
  • 詳解mongodb 主從配置

    詳解mongodb 主從配置

    我研究過的nosql,memcache,redis,mongodb都是支持分布式的,生產(chǎn)環(huán)境中用過memcache,redis,性能穩(wěn)定。mongodb是最接近關系型數(shù)據(jù)庫的,不用花很多時間去構建數(shù)據(jù)庫模型,將來我會用mongodb,看一下主從配置
    2014-07-07
  • Mongodb安裝與配置筆記

    Mongodb安裝與配置筆記

    這篇文章主要介紹了Mongodb安裝與配置筆記,本文環(huán)境為Linux,講解了Mongodb安裝步驟、配置方法、服務啟動、后臺運行等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • MongoDB入門教程之C#驅動操作實例

    MongoDB入門教程之C#驅動操作實例

    這篇文章主要介紹了MongoDB入門教程之C#驅動操作實例,即C#中操作MongoDB數(shù)據(jù)的方法和代碼示例,需要的朋友可以參考下
    2014-08-08
  • MongoDB設置登錄賬號、密碼及權限的詳細過程

    MongoDB設置登錄賬號、密碼及權限的詳細過程

    這篇文章主要給大家介紹了關于MongoDB設置登錄賬號、密碼及權限的詳細過程,文中通過代碼以及圖文介紹的非常詳細,對大家學習或者使用MongoDB具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09

最新評論

徐州市| 梁山县| 柞水县| 高密市| 同仁县| 图木舒克市| 上饶县| 尼勒克县| 仪征市| 柯坪县| 武汉市| 南昌市| 安吉县| 怀宁县| 安平县| 巴楚县| 虞城县| 乾安县| 历史| 库尔勒市| 弥勒县| 大渡口区| 潜江市| 江城| 泌阳县| 彰化市| 京山县| 新和县| 汝州市| 霍城县| 克山县| 澜沧| 岳西县| 邵东县| 深泽县| 江山市| 中山市| 万盛区| 彩票| 高碑店市| 新化县|