欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot整合mongodb使用詳解

 更新時間:2023年07月31日 08:23:52   作者:逆風飛翔的小叔  
MongoDB是一個文檔數(shù)據庫(以?JSON?為數(shù)據模型),由C++語言編寫,旨在為WEB應用提供可擴展的高性能數(shù)據存儲解決方案,本文就給大家介紹一下詳細介紹一下springboot整合mongodb使用,需要的朋友可以參考下

一、mongodb簡介

1.1 什么是mongodb

MongoDB是一個文檔數(shù)據庫(以 JSON 為數(shù)據模型),由C++語言編寫,旨在為WEB應用提供可擴展的高性能數(shù)據存儲解決方案。

1.2 mongodb特點

  • MongoDB是一個介于關系數(shù)據庫和非關系數(shù)據庫之間的產品,是非關系數(shù)據庫當中功能最豐富,最像關系數(shù)據庫的;
  • 它支持的數(shù)據結構非常松散,數(shù)據格式為BSON,一種類似JSON的二進制形式的存儲格
  • 式,簡稱Binary JSON ,和JSON一樣支持內嵌的文檔對象和數(shù)組對象,因此可以存儲比較復雜的數(shù)據類型;
  • MongoDB最大特點是支持的查詢語言非常強大,語法有點類似于面向對象的查詢語言,幾乎可以實現(xiàn)類似關系數(shù)據庫單表查詢的絕大部分功能,而且還支持對數(shù)據建立索引;
  • 原則上 Oracle 和MySQL 能做的事情,MongoDB 都能做(包括 ACID 事務);

二、mongodb中的核心術語

在正式學習mogodb之前,有必要對mogodb中的基本術語和相關的語法做一個簡單了解,就像學習mysql必須掌握其基本語法、DDL、DML等一樣的道理,當然學習mogodb時可以類比mysql中的數(shù)據庫,表和字段進行理解。

2.1 mogodb與數(shù)據庫對比

MongoDB  概念與關系型數(shù)據庫( RDBMS )非常類似,見下表;

2.2 mongodb中的核心概念

關于上述表中關于mongodb各個術語,再做簡單的補充說明:

數(shù)據庫(database)

最外層的概念,可以理解為邏輯上的名稱空間,一個數(shù)據庫包含多個不同名稱的集合

集合(collection)

相當于SQL中的表,一個集合可以存放多個不同的文檔

文檔(document)

一個文檔相當于數(shù)據表中的一行,由多個不同的字段組成

字段(field)

文檔中的一個屬性,等同于列(column) 

索引(index)

獨立的檢索式數(shù)據結構,與SQL概念一致 

id

每個文檔中都擁有一個唯一的id字段,相當于SQL中的主鍵(primary key) 

視圖(view)

可以看作一種虛擬的(非真實存在的)集合,與SQL中的視圖類似。從MongoDB3.4版本開始提供了視圖功能,其通過聚合管道技術實現(xiàn) 

聚合操作($lookup)

MongoDB用于實現(xiàn)“類似”表連接(tablejoin)的聚合操作符 

2.3 與關系數(shù)據庫的差異

盡管這些概念大多與SQL標準定義類似,但MongoDB與傳統(tǒng)RDBMS仍然存在不少差異,包括:

2.3.1 半結構化

半結構化,在一個集合中,文檔所擁有的字段并不需要是相同的,而且也不需要對所用的字段進行聲明,因此,MongoDB具有很明顯的半結構化特點。

2.3.2 支持多級嵌套

除了松散的表結構,文檔還可以支持多級的嵌套、數(shù)組等靈活的數(shù)據類型,非常契合面向對象的編程模型。

2.3.3 關系弱化

弱關系,MongoDB沒有外鍵的約束,也沒有非常強大的表連接能力。類似的功能需要使用聚合管道技術來彌補。 

三、mongodb 技術優(yōu)勢和應用場景

3.1 mongodb 技術優(yōu)勢

傳統(tǒng)的關系型數(shù)據庫(如MySQL),在數(shù)據操作的“三高”需求以及應對Web2.0的網站需求面前,逐漸開始顯得吃力,對于數(shù)據庫來說,盡管可以通過集群或其他方式對單節(jié)點的mysql實例進行擴展,但這樣帶來的成本和代價也是巨大的,由于mongodb從一開始就是為分布式而生,面對海量數(shù)據,高并發(fā)的場景有得天獨厚的優(yōu)勢,同時其豐富的集群模式可以適應企業(yè)不同的數(shù)據運維和部署場景。

關于三高的解釋補充

1、High performance - 對數(shù)據庫高并發(fā)讀寫的需求;

2、Huge Storage - 對海量數(shù)據的高效率存儲和訪問的需求;

3、High Scalability && High Availability- 對數(shù)據庫的高可擴展性和高可用性的需求;

3.2 mongodb 應用場景

從目前阿里云 MongoDB 云數(shù)據庫上的用戶看,MongoDB 的應用已經滲透到各個領域,這里總結如下:

游戲場景

使用 MongoDB 存儲游戲用戶信息,用戶的裝備、積分等直接以內嵌文檔的形式存儲,方便查詢、更新;

物流場景

使用 MongoDB 存儲訂單信息,訂單狀態(tài)在運送過程中會不斷更新,以MongoDB 內嵌
數(shù)組的形式來存儲,一次查詢就能將訂單所有的變更讀取出來;

社交場景

使用 MongoDB 存儲存儲用戶信息,以及用戶發(fā)表的朋友圈信息,通過地理位置索引實
現(xiàn)附近的人、地點等功能; 

物聯(lián)網場景

使用 MongoDB 存儲所有接入的智能設備信息,以及設備匯報的日志信息,并對這些信息進行多維度的分析; 

大數(shù)據應用

使用云數(shù)據庫MongoDB作為大數(shù)據的云存儲系統(tǒng),隨時進行數(shù)據提取分析,掌握行業(yè)動態(tài)

3.3 什么時候選擇 mongodb

在上述的應用場景中,數(shù)據操作方面有如下一些共同的特點:

1)數(shù)據量大;

2)寫入操作頻繁(讀寫可能都很頻繁);

3)價值較低的數(shù)據,對事務性要求不高;

對于這樣的數(shù)據,我們更適合使用MongoDB來實現(xiàn)數(shù)據的存儲。在實際架構選型上,除了上述的三個特點外,如果你還猶豫是否要選擇它?可以考慮以下的一些問題:

1、應用不需要事務及復雜 join 支持;
2、新應用,需求會變,數(shù)據模型無法確定,想快速迭代開發(fā);
3、應用需要2000-3000以上的讀寫QPS(更高也可以);
4、應用需要TB甚至 PB 級別數(shù)據存儲;
5、應用發(fā)展迅速,需要能快速水平擴展;
6、應用要求存儲的數(shù)據不丟失;
7、應用需要99.999%高可用;
8、應用需要大量的地理位置查詢、文本查詢;

如果上述有1個符合,可以考慮 MongoDB,2個及以上的符合,選擇 MongoDB肯定不會錯。

四、快速部署 mongodb

為方便后面代碼整合使用,下面通過docker快速部署起一個mongodb的服務,按照下面的操作步驟執(zhí)行;

4.1 搭建過程

4.1.1 拉取鏡像

docker pull mongo:4.4

4.1.2 啟動鏡像

在啟動鏡像之前先創(chuàng)建一個數(shù)據目錄的映射

mkdir data

使用下面的命令啟動鏡像

docker run -itd --name mongo -v /usr/local/mongo/data:/data/db -p 27017:27017 mongo:4.4 --auth

參數(shù)說明:

1)-p 27017:27017,映射容器服務的 27017 端口到宿主機的 27017 端口,外部可以直接通過 宿主機 ip:27017 訪問到 mongo 的服務;

2)--auth:需要密碼才能訪問容器服務;

4.2 創(chuàng)建賬戶

4.2.1 登錄mongo容器,并進入到【admin】數(shù)據庫

docker exec -it mongo mongo admin

4.2.2 創(chuàng)建一個用戶

mongo 默認是沒有用戶的,這里root只是自己指定的用戶名,可以自己命名

db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});

參數(shù)說明:

  • 【user:‘root’ 】:設置用戶名為root;
  • 【pwd:‘123456’】:設置密碼為123456;
  • 【role:‘userAdminAnyDatabase’】:只在admin數(shù)據庫中可用,賦予用戶所有數(shù)據庫的userAdmin權限;
  • 【db: ‘admin’】:可操作的數(shù)據庫;
  • 【‘readWriteAnyDatabase’】:賦予用戶讀寫權限;

dbAdmin:允許用戶在指定數(shù)據庫中執(zhí)行管理函數(shù),如索引創(chuàng)建、刪除,查看統(tǒng)計或訪問system.profile

4.3 連接與測試

4.3.1連接mongo數(shù)據庫

db.auth('root', '123456');

4.3.2 插入與查詢數(shù)據

db.user.insert({"name":"zhangsan","age":18});
db.user.find();

4.3.3 使用客戶端連接

使用客戶端工具連接,如下圖所示,在下面填寫自己的連接信息即可;

五、整合springboot使用

5.1 前置說明

springboot與mongodb整合使用通常有兩種方式,這兩種方式在開發(fā)過程中結合實際需要都可以選擇;

5.1.1 jpa方式整合

使用過spingboot的jpa操作mysql的同學應該不陌生,這種方式的好處很明顯,就是jpa中針對常用的對于數(shù)據庫的CRUD操作相關的API做了封裝,開發(fā)者對于常用的增刪改查功能開發(fā)起來效率很高,缺點是如果業(yè)務操作比較復雜,需要編寫比較復雜的sql語句時,使用jpa就不太方便了,盡管jpa也可以通過注解編寫部分類sql語句,但是語法還是有一定上手成本的。

5.1.2 MongoTemplate 方式整合

很多第三方組件都與springboot做了整合集成,比如像redis提供了redisTemplate,kafka集成springboot時提供了kafkaTemplate等類似,mongodb也提供了MongoTemplate ,MongoTemplate 提供了滿足日常開發(fā)需要的豐富的API,基本上涵蓋了大部分的場景需求,學習成本較低,網上可以參閱的資料也比較豐富??梢宰鳛榈谝贿x擇。

為了更好的滿足日常開發(fā)中的需要,下面將這兩種方式的使用做一個詳細的介紹。

5.2 準備一個數(shù)據庫

為了方便后文中代碼的測試,基于上面已經搭建完成的mongodb服務,使用root賬戶登錄進去之后,創(chuàng)建一個名為 book的collection集合,創(chuàng)建也比較簡單,使用上面的root用戶登錄進客戶端之后,直接輸入下面的命令即可創(chuàng)建;

use 你的數(shù)據庫名稱

5.3 jpa方式整合使用

5.3.1 創(chuàng)建一個springboot的工程

創(chuàng)建一個空的springboot工程,目錄結構如下:

5.3.2 導入核心依賴

為了接口測試方便,引入了swagger的相關依賴;

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <!--swagger API獲取-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!--swagger-ui API獲取-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
    </dependencies>

5.3.3 application 配置文件

application.yml中添加如下配置

spring:
  data:
    mongodb:
      uri: mongodb://root:123456@IP地址:27017/book?authSource=admin&authMechanism=SCRAM-SHA-1
server:
  port: 8082

5.3.4 實體數(shù)據對象

創(chuàng)建一個Book類,作為與mongo中的book這個collection集合的映射,對象中的屬于對應著數(shù)據庫中的collection的各個字段;

@Document(collection="book")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BookInfo {
    @Id
    private String id;
    @Field("name")
    private String name;
    @Field("price")
    private Integer price;
    @Field("publish_time")
    private String publishTime;
    @Field("comment")
    private String comment;
}

5.3.5 jpa數(shù)據持久層

添加一個與mongodb集合交互的jpa接口,繼承MongoRepository接口,使用過jpa的同學對此應該不陌生;

public interface BookRepository  extends MongoRepository<BookInfo,String> {
}

5.3.6 核心操作接口

為方便測試,創(chuàng)建一個接口類,由于基本的增刪改查邏輯相對比較簡單,直接調用MongoRepository即可,下面貼出基本的增刪改查接口

    @Autowired
    private BookService bookService;
	@PostMapping("/save")
    public String save(BookInfo bookInfo) {
        return bookService.saveBook(bookInfo);
    }
    @PostMapping("/update")
    public String update(BookInfo bookInfo) {
        return bookService.update(bookInfo);
    }
    @GetMapping("/delete")
    public String deleteById(String id) {
        return bookService.deleteById(id);
    }
    @PostMapping("/detail")
    public BookInfo findById(String id) {
        return bookService.findById(id);
    }

業(yè)務實現(xiàn)

    @Autowired
    private BookRepository bookRepository;
    /**
     * 保存
     * @param bookInfo
     * @return
     */
    public String saveBook(BookInfo bookInfo){
        bookInfo.setId(IdUtil.generateId());
        bookRepository.save(bookInfo);
        return "save book info success";
    }
    /**
     * 修改
     * @param bookInfo
     * @return
     */
    public String update(BookInfo bookInfo) {
        if(StringUtils.isEmpty(bookInfo.getId())){
            throw new RuntimeException("ID不能為空");
        }
        bookRepository.save(bookInfo);
        return "save book info success";
    }
    /**
     * 根據ID刪除
     * @param id
     * @return
     */
    public String deleteById(String id) {
        bookRepository.deleteById(id);
        return "delete success";
    }
    /**
     * 查詢所有
     * @return
     */
    public List<BookInfo> findList() {
        return bookRepository.findAll();
    }
    /**
     * 根據ID獲取
     * @param id
     * @return
     */
    public BookInfo findById(String id) {
        Optional<BookInfo> bookInfoOptional = bookRepository.findById(id);
        return bookInfoOptional.isPresent() ? bookInfoOptional.get() : null;
    }

以查詢詳情接口為例,在swagger中做一下測試,效果如下:

5.3.7 常用復雜查詢接口

相信很多項目使用mongodb的一個重要的原因就是使用mongo進行查詢時性能很高,尤其是針對一些復雜的查詢場景時優(yōu)勢很明顯,下面結合開發(fā)中其他比較常用的幾個查詢場景做一下補充;

模糊查詢

主要用到了ExampleMatcher這個匹配對象,類似于mysql的: like '%關鍵字%';

    /**
     * 模糊查詢
     * @param name
     * @return
     */
    public List<BookInfo> query(String name) {
        //構建匹配器對象
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //設置默認字符串匹配方式:模糊查詢
                .withIgnoreCase(true);      //設置默認大小寫忽略方式:true為忽略大小寫
        BookInfo bookInfo = new BookInfo();
        bookInfo.setName(name);
        Example<BookInfo> bookInfoExampleExample = Example.of(bookInfo,matcher);
        List<BookInfo> bookInfos = bookRepository.findAll(bookInfoExampleExample);
        return bookInfos;
    }

分頁查詢

public Page<BookInfo> pageQuery(Integer pageNo,Integer pageSize,String name) {
        //構造排序器,設置排序字段
        Sort sort = Sort.by(Sort.Direction.ASC,"price");
        Pageable pageable = null;
        if(Objects.isNull(pageNo) || Objects.isNull(pageSize)){
            pageNo = 0;
            pageSize=10;
        }
        pageable = PageRequest.of(pageNo, pageSize, sort);
        //創(chuàng)建匹配器,設置查詢條件
        ExampleMatcher matcher = ExampleMatcher.matching() //構建匹配器對象
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //設置默認字符串匹配方式:模糊查詢
                .withIgnoreCase(true); //設置默認大小寫忽略方式:true為忽略大小寫
        //設置查詢條件
        BookInfo bookInfo = new BookInfo();
        bookInfo.setName(name);
        Example<BookInfo> bookExample = Example.of(bookInfo,matcher);
        //查詢
        Page<BookInfo> page = bookRepository.findAll(bookExample, pageable);
        return page;
    }

sql方式查詢

某些情況下可能已有的API并不能很好的滿足,就需要通過編寫sql的方式實現(xiàn)了,在使用jpa操作mysql的時候俗稱hql語言,關于使用MongoRepository編寫類sql的相信資料可以參閱相關資料,網上可以搜到很多,其核心語法仍然是mongodb自身的那些操作語句,只是需要遵照Java中的編寫規(guī)范;

下面提供了幾個常用的查詢,提供參考

public interface BookRepository  extends MongoRepository<BookInfo,String> {
	//根據名稱查詢
    @Query("{name: ?0}")
    List<BookInfo> findByBookName(String name);
	//查詢價格大于某個數(shù)的集合
    @Query(value = "{price: { $gt: ?0 }}")
    List<BookInfo> findByBookPriceThan(int price);
	//查詢ID在某個集合中,類似mysql 的 in ()語法
    @Query(value = "{'_id':{$in:?0}}")
    List<BookInfo> findAllByIdIn(List<String> ids);
}

5.4 MongoTemplate 方式整合使用

MongoTemplate相對于MongoRepository來說,從API的使用上來說,選擇更豐富,編碼也更友好,同時API的使用也更加符合編碼的習慣,下面再使用MongoTemplate 的方式做一下操作演示

配置文件等信息暫時不用修改

5.4.1 核心增刪接口

接口層

@RestController
@RequestMapping("/template")
public class BookTemplateController {
    @Autowired
    private BookTemplateService bookTemplateService;
    @PostMapping("/save")
    public BookInfo save(BookInfo bookInfo){
        return bookTemplateService.save(bookInfo);
    }
    @PostMapping("/update")
    public BookInfo update(BookInfo bookInfo){
        return bookTemplateService.update(bookInfo);
    }
    @GetMapping("/delete")
    public String delete(String id){
        return bookTemplateService.delete(id);
    }
    @GetMapping("/details")
    public BookInfo details(String id){
        return bookTemplateService.findById(id);
    }
}

業(yè)務實現(xiàn)

@Service
public class BookTemplateService {
    @Autowired
    private MongoTemplate mongoTemplate;
    public BookInfo save(BookInfo bookInfo) {
        bookInfo.setId(IdUtil.generateId());
        BookInfo book = mongoTemplate.save(bookInfo);
        return book;
    }
    public BookInfo update(BookInfo bookInfo) {
        if(StringUtils.isEmpty(bookInfo.getId())){
            throw new RuntimeException("ID為空");
        }
        Query query = Query.query(Criteria.where("_id").is(bookInfo.getId()));
        BookInfo dbBook = mongoTemplate.findOne(query, BookInfo.class);
        if(Objects.isNull(dbBook)){
            return null;
        }
        Update update = new Update();
        if(!StringUtils.isEmpty(bookInfo.getName())){
            update.set("name",bookInfo.getName());
        }
        if(!StringUtils.isEmpty(bookInfo.getComment())){
            update.set("comment",bookInfo.getComment());
        }
        if(Objects.nonNull(bookInfo.getPrice())){
            update.set("price",bookInfo.getPrice());
        }
        mongoTemplate.updateFirst(query,update,BookInfo.class);
        return bookInfo;
    }
    public String delete(String id) {
        Query query = new Query(Criteria.where("_id").is(id));
        mongoTemplate.remove(query,BookInfo.class);
        return "deleted";
    }
    public BookInfo findById(String id) {
        BookInfo bookInfo = mongoTemplate.findById(id, BookInfo.class);
        return bookInfo;
    }
}

5.4.2 復雜查詢接口

在實際業(yè)務開發(fā)中,更多的情況下會用到mongodb較復雜的查詢,下面列舉一些常用的復雜查詢的場景提供參考

json字符串方式查詢

如果在API調用過程中覺得書寫不習慣的話,也支持原生的json語句查詢,即將在客戶端命令行中的查詢語句轉為json作為一個完整的語句進行查詢

    public List<BookInfo> queryByJson(String name,String type,Integer price) {
        //String json1 = "{name:'" + name +"'}";
        String json2 = "{$or:[{price:{$gt: '" +price+"'}},{type: '"+type+"'}]}";
        Query query = new BasicQuery(json2);
        //查詢結果
        List<BookInfo> employees = mongoTemplate.find(query, BookInfo.class);
        return employees;
    }

模糊查詢

類似于mysql中的like

    //模糊查詢
    public List<BookInfo> queryLike(String key){
        Query query = new Query(Criteria.where("name").regex(key));
        List<BookInfo> bookInfos = mongoTemplate.find(query, BookInfo.class);
        return bookInfos;
    }

范圍查詢

    //查詢價格大于某個值
    public List<BookInfo> queryMoreThan(Integer price){
        Query query = new Query(Criteria.where("price").gte(price));
        List<BookInfo> bookInfos = mongoTemplate.find(query, BookInfo.class);
        return bookInfos;
    }

多條件查詢

類似于mysql中的多個條件通過and的查詢

    //多條件查詢
    public List<BookInfo> queryMultiParams(String name,String type,Integer price){
        //or 條件查詢
        Criteria criteria = new Criteria();
        /*criteria.orOperator(
                Criteria.where("name").regex(name),
                Criteria.where("price").gte(price),
                Criteria.where("type").is(type)
        );*/
        //and 條件查詢
        criteria.andOperator(
                Criteria.where("price").gte(price),
                Criteria.where("type").is(type)
        );
        Query query = new Query(criteria);
        List<BookInfo> bookInfos = mongoTemplate.find(query, BookInfo.class);
        return bookInfos;
    }

分頁查詢

    //分頁查詢
    public PageInfo<BookInfo> pageQuery(Integer pageIndex,Integer pageSize,String type){
        Criteria criteria = new Criteria();
        if(!StringUtils.isEmpty(type)){
            criteria = Criteria.where("price").gte(type);
        }
        //TODO 如果有更多的查詢條件,繼續(xù)拼接 ...
        Query query = new Query(criteria);
        if(Objects.isNull(pageIndex) || Objects.isNull(pageSize)){
            pageIndex = 1;
            pageSize = 2;
        }
        //查詢總數(shù)
        long total = mongoTemplate.count(query, BookInfo.class);
        System.out.println(total);
        //查詢結果根據價格排個序
        query.with(Sort.by(Sort.Order.desc("price")))
                .skip((pageIndex-1) * pageSize) //指定跳過記錄數(shù)
                .limit(pageSize); //每頁顯示記錄數(shù)
        List<BookInfo> bookInfos = mongoTemplate.find(query, BookInfo.class);
        PageInfo<BookInfo> pageInfo = new PageInfo(pageIndex,pageSize,total,bookInfos);
        return pageInfo;
    }

5.4.3 聚合查詢

聚合操作處理數(shù)據記錄并返回計算結果(諸如統(tǒng)計平均值,求和等)。聚合操作組值來自多個文檔,可以對分組數(shù)據執(zhí)行各種操作以返回單個結果。聚合操作包含三類:單一作用聚合、聚合管道、MapReduce。

單一作用聚合

提供了對常見聚合過程的簡單訪問,操作都從單個集合聚合文檔;

聚合管道

聚合管道是一個數(shù)據聚合的框架,模型基于數(shù)據處理流水線的概念。文檔進入多級管道,將文檔轉換為聚合結果;

MapReduce

MapReduce操作具有兩個階段:處理每個文檔并向每個輸入文檔發(fā)射一個或多個對象的map階段,以及reduce組合map操作的輸出階段。

5.4.4 聚合統(tǒng)計查詢案例

關于分組聚合統(tǒng)計的內容比較多,限于篇幅這里不做展開,我們將book這個collection集合的字段進行擴展(為了進行分組聚合使用),并插入一些數(shù)據,如下所示

下面我們要實現(xiàn)的需求是,

按照book的type字段進行分組,

1)統(tǒng)計每個type類型下的book的閱讀總數(shù),平均閱讀數(shù);

2)統(tǒng)計每個type類型下的book的喜歡總數(shù),平均喜歡的數(shù)量;

完整的代碼如下

    public void groupQuery(){
        // 查詢條件
        Criteria criteria = new Criteria();
        MatchOperation matchOperation = Aggregation.match(criteria);
        // 查詢包括的字段
        ProjectionOperation projectionOperation = Aggregation.project("id", "name","price", "type","readCount","likeCount");
        // 分組統(tǒng)計
        GroupOperation groupOperation = Aggregation.group("type")
                //.first("type").as("type")
                .count().as("typeCount")
                .sum("likeCount").as("totalLike")
                .avg("likeCount").as("avgLikeCount")
                .sum("readCount").as("totalReadCount")
                .sum("readCount").as("avgReadCount");
        AggregationResults<Map> totalAuthorResult = mongoTemplate.aggregate(Aggregation.newAggregation(BookInfo.class,
                matchOperation, projectionOperation, groupOperation), Map.class);
        //獲取分類總數(shù)
        int typeCount = (int) totalAuthorResult.getMappedResults().size();
        System.out.println(typeCount);
        //得到最終分組聚合的結果
        List<Map> mappedResults = totalAuthorResult.getMappedResults();
        for(Map map :mappedResults){
            System.out.println(map.keySet());
        }
    }

通過debug,可以看到查詢得到的結果如下

如果你需要獲取最終的各個分組的統(tǒng)計結果,只需遍歷上述的結果集即可。

六、結語

關于mongodb的技術體系是比較龐大的,本文只是冰山一角,要深入學習和掌握mongodb還需要實際開發(fā)過程中通過經驗的積累才能加深對mongodb的理解和運用,隨著技術的發(fā)展,mongodb在越來越多的領域都有著不錯的運用,因此感興趣的同學可以在此基礎上深入研究。

以上就是springboot整合mongodb使用詳解的詳細內容,更多關于springboot整合mongodb的資料請關注腳本之家其它相關文章!

相關文章

  • 5分鐘搞懂java注解@Annotation的具體使用

    5分鐘搞懂java注解@Annotation的具體使用

    這篇文章主要介紹了5分鐘搞懂java注解@Annotation的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • 使用@Value注解從配置文件中讀取數(shù)組

    使用@Value注解從配置文件中讀取數(shù)組

    這篇文章主要介紹了使用@Value注解從配置文件中讀取數(shù)組的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • spring boot actuator監(jiān)控超詳細教程

    spring boot actuator監(jiān)控超詳細教程

    Spring Boot Actuator就是一款可以幫助你監(jiān)控系統(tǒng)數(shù)據的框架,其可以監(jiān)控很多很多的系統(tǒng)數(shù)據,接下來通過本文給大家介紹spring boot actuator監(jiān)控超詳細教程,感興趣的朋友一起看看吧
    2021-10-10
  • Java獲取一個類的隱藏屬性的幾種方法

    Java獲取一個類的隱藏屬性的幾種方法

    這篇文章主要討論了在Java中如何訪問或修改類的私有字段,包括使用公共的getter和setter方法、反射、繼承和序列化機制,文章強調了尊重類的封裝性,感興趣的小伙伴跟著小編一起來看看吧
    2025-02-02
  • 這么優(yōu)雅的Java ORM沒見過吧!

    這么優(yōu)雅的Java ORM沒見過吧!

    這篇文章主要介紹了Java ORM的相關資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • java鎖升級過程過程詳解

    java鎖升級過程過程詳解

    這篇文章主要介紹了Java鎖升級的實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • eclipse的web項目實現(xiàn)Javaweb購物車的方法

    eclipse的web項目實現(xiàn)Javaweb購物車的方法

    這篇文章主要介紹了eclipse的web項目實現(xiàn)Javaweb購物車的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Spring Boot創(chuàng)建非可執(zhí)行jar包的實例教程

    Spring Boot創(chuàng)建非可執(zhí)行jar包的實例教程

    這篇文章主要介紹了Spring Boot創(chuàng)建非可執(zhí)行jar包的實例教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Java 如何讀取Excel格式xls、xlsx數(shù)據工具類

    Java 如何讀取Excel格式xls、xlsx數(shù)據工具類

    這篇文章主要介紹了Java 如何讀取Excel格式xls、xlsx數(shù)據工具類的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • springcloud部署提示 找不到url的解決

    springcloud部署提示 找不到url的解決

    這篇文章主要介紹了springcloud部署提示 找不到url的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01

最新評論