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

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

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

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

(1)先來(lái)一個(gè)簡(jiǎn)單的單條件查詢:

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)建一個(gè)Query 實(shí)例,表示是一個(gè)查詢動(dòng)作。query 對(duì)象,繼續(xù)補(bǔ)充一個(gè)Criteria 實(shí)例。Criteria 英[kra?'t??ri?] 譯為比標(biāo)準(zhǔn)、準(zhǔn)則、尺度。我們可以直接理解為查詢條件。注意Criteria 實(shí)例是由 Criteria.where 方法創(chuàng)建出來(lái)的。(防盜連接:本文首發(fā)自http://www.cnblogs.com/jilodream/ )這是一個(gè)簡(jiǎn)單工廠,參數(shù)為要查詢的表的列名(文檔的字段)。再跟一個(gè)in() ,表示列的in 操作,in() 中跟的是in操作的值。最后直接用mongoTemplate 實(shí)例執(zhí)行find 操作就好,條件為查詢邏輯和表對(duì)應(yīng)的類(lèi)文件。我們這里使用的是in 操作,除此之外,常用的還有

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

regex

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

這些都是基本操作,有sql經(jīng)驗(yàn)的同學(xué)肯定明白具體怎么使用。
我們?cè)傺a(bǔ)充一個(gè)模糊查詢的例子:

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)接著來(lái)看一個(gè)相對(duì)復(fù)雜點(diǎn)的組合條件:兩個(gè)或條件,類(lèi)似于SQL中的: A表達(dá)式 OR B表達(dá)式,代碼如下

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)建好兩個(gè)Criteria的簡(jiǎn)單條件之后,再創(chuàng)建一個(gè)新的Criteria 實(shí)例,用一個(gè)or操作將二者關(guān)聯(lián)起來(lái).
query 接收最新的Criteria 實(shí)例,然后執(zhí)行查詢即可。
這里的寫(xiě)法類(lèi)似于sql中的
where name like "%ong%" or age != 15

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

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/ )

這里的寫(xiě)法類(lèi)似于sql中的

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

總體來(lái)看:一個(gè)Criteria 實(shí)例,就是一個(gè)查詢條件。

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

這個(gè)過(guò)程就像壘積木一樣:

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

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

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

整體代碼如下:

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)]

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

相關(guān)文章

  • Mongodb啟動(dòng)命令參數(shù)中文說(shuō)明

    Mongodb啟動(dòng)命令參數(shù)中文說(shuō)明

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

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

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

    ?PostgreSQL?與MongoDB使用對(duì)比分析

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

    mongodb 3.4下遠(yuǎn)程連接認(rèn)證失敗的解決方法

    這篇文章主要給大家介紹了在mongodb 3.4下遠(yuǎn)程連接認(rèn)證失敗的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • 深究從MongoDB的ObjectId中獲取時(shí)間信息

    深究從MongoDB的ObjectId中獲取時(shí)間信息

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

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

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

    詳解mongodb 主從配置

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

    Mongodb安裝與配置筆記

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

    MongoDB入門(mén)教程之C#驅(qū)動(dòng)操作實(shí)例

    這篇文章主要介紹了MongoDB入門(mén)教程之C#驅(qū)動(dòng)操作實(shí)例,即C#中操作MongoDB數(shù)據(jù)的方法和代碼示例,需要的朋友可以參考下
    2014-08-08
  • MongoDB設(shè)置登錄賬號(hào)、密碼及權(quán)限的詳細(xì)過(guò)程

    MongoDB設(shè)置登錄賬號(hào)、密碼及權(quán)限的詳細(xì)過(guò)程

    這篇文章主要給大家介紹了關(guān)于MongoDB設(shè)置登錄賬號(hào)、密碼及權(quán)限的詳細(xì)過(guò)程,文中通過(guò)代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MongoDB具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

讷河市| 北流市| 科技| 安乡县| 高陵县| 内江市| 津南区| 永昌县| 湘潭市| 荔浦县| 普安县| 易门县| 北辰区| 石渠县| 秦安县| 昆山市| 临江市| 格尔木市| 正镶白旗| 五寨县| 黎城县| 彭阳县| 敦煌市| 固原市| 横峰县| 盖州市| 安仁县| 洛浦县| 株洲市| 辽中县| 晋城| 伊川县| 灵寿县| 获嘉县| 乌苏市| 东山县| 海门市| 保康县| 湛江市| 万源市| 屏东市|