SpringBoot集成MongoDB

简介: MongoDB是一个基于分布式文件存储的数据库,c++编写,可扩展高性能数据存储方案。MongoDb介于关系型数据库和非关系型数据库之间,是非关系型数据库中功能最多的,最像关系型数据库。数据结构非常松散可以存储非常复杂的数据对象。Mongodb支持的查询语言非常强大,语法类似于面向对象的查询语言,几乎可以实现类似关系型数据库单表查询的所有功能,而且还支持对数据建立索引。

[toc]

NoSql

NotOnly Sql,不仅仅是 sql 。

NoSql数据库分类:
键值对:redis
列存储:Hbase
文档型:mongodb
图形(graph)数据库:Neo4j,infogrid

MongoDB

是一个基于分布式文件存储的数据库,c++编写,可扩展高性能数据存储方案。MongoDb介于关系型数据库和非关系型数据库之间,是非关系型数据库中功能最多的,最像关系型数据库。数据结构非常松散可以存储非常复杂的数据对象。Mongodb支持的查询语言非常强大,语法类似于面向对象的查询语言,几乎可以实现类似关系型数据库单表查询的所有功能,而且还支持对数据建立索引。

在高负载的情况下,MongoDB 天然支持水平扩展和高可用,可以很方便地添加节点/实例,以保证服务性能和可用性。MongoDB 可以用于代替传统的关系型数据库或键/值存储方式,皆在为 Web 应用提供可扩展的高可用高性能数据存储解决方案。

存储结构

  • 文档(Document) :MongoDB 中最基本的单元,由 BSON 键值对(key-value)组成

  • 集合(Collection) :一个集合可以包含多个文档,每个文档的结构可以不同

  • 数据库(Database) :一个数据库中可以包含多个集合,可以在 MongoDB 中创建多个数据库

BSON是 Binary JSON的简称,是 JSON 文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中,还包含允许表示不属于 JSON 规范的数据类型的扩展。与 JSON 相比,BSON 着眼于提高存储和扫描效率

传统关系型数据和MongoDB类比:

MongoDB 传统关系型数据库
Database schema
Collection Table
Document Row
Field Column

特性

  • BSON:MongoDB 中的数据就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元
  • 模式自由:集合的概念类似 MySQL 里的表,但它不需要定义任何模式,能够用更少的数据对象表现复杂的领域模型对象
  • 支持多种查询方式 :MongoDB 查询 API 支持读写操作 (CRUD)以及数据聚合、文本搜索和地理空间查询。
  • 支持 ACID 事务 :NoSQL 数据库通常不支持事务,为了可扩展和高性能进行了权衡。不过,也有例外,MongoDB 就支持事务。与关系型数据库一样,MongoDB 事务同样具有 ACID 特性。MongoDB 单文档原生支持原子性,也具备事务的特性。MongoDB 4.0 加入了对多文档事务的支持,但只支持复制集部署模式下的事务,也就是说事务的作用域限制为一个副本集内。MongoDB 4.2 引入了分布式事务,增加了对分片集群上多文档事务的支持,并合并了对副本集上多文档事务的现有支持。
  • 聚合管道:聚合管道用来执行数据聚合、过滤的操作
  • 支持多种类型的索引 :单字段索引、复合索引、多键索引、哈希索引、文本索引、 地理位置索引等
  • 支持 failover :提供自动故障恢复的功能,主节点发生故障时,自动从从节点中选举出一个新的主节点,确保集群的正常使用,这对于客户端来说是无感知的
  • 支持分片集群 :MongoDB 支持集群自动切分数据,让集群存储更多的数据,具备更强的性能。在数据插入和更新时,能够自动路由和存储。
  • 支持存储大文件 :MongoDB 的单文档存储空间要求不超过 16MB。对于超过 16MB 的大文件,MongoDB 提供了 GridFS 来进行存储,通过 GridFS,可以将大型数据进行分块处理,然后将这些切分后的小文档保存在数据库中。

实践

pom


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

yml


spring:
  application:
    name: MongoApp
  data:
    mongodb:
      uri: mongodb://127.0.0.1:27017/FirstMongoDBSchema



logging:
  level:
    org.springframework.data.mongodb: debug

model


package com.ramble.mongodb.model;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.Date;

@Data
@Document(collection = "students")
public class Student implements Serializable {
   
   

    @Id
    private Long id;
    private String userName;
    private String passWord;
    private Integer age;
    private Date createTime;
}
  • Document:此实体对应的文档
  • collection="students":此实体所属的集合为students集合
  • Id:文档的id,唯一标识

repository


package com.ramble.mongodb.repository;
import com.ramble.mongodb.model.Student;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface StudentRepository extends MongoRepository<Student, Integer> {
   
   

List<Student> findByUserName(String userName);

List<Student> findByPassWordLike(String passWord);

@Query(   value = "{'age' : {\"$gt\" : ?0}}")List<Student> findList(Integer age);

}
  • MongoRepository:继承MongoRepository即可开箱即用基本的CURD操作
  • Query: 如果默认的无法满足需求,可以编写自定义查询语句
  • findList:表示查询age 大于 传递进来的age参数的数据,?0 表示获取参数列表的第一个参数,这里就体现框架的强大之处了,这里的写法非常类似 spring-data-jpa 的写法。框架屏蔽了技术实现的细节,用过jpa的开发人员可以很平滑的在项目中继承mongodb。
  • findByUserName: 查询userName等于传递进来的userName参数的数据,会自动生成查询语句,可通过控制台输出观察到

controller



package com.ramble.mongodb.controller;
import com.alibaba.fastjson.JSON;
import com.ramble.mongodb.model.Student;
import com.ramble.mongodb.repository.StudentRepository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;

@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("/student")
public class StudentController {
   
   

    private StudentRepository studentRepository;

    @PostMapping("/")
    public void create(@RequestBody Student param) {
   
   
        Student save = studentRepository.save(param);
    }

    @DeleteMapping("/{id}")
    public void delete(@PathVariable Integer id) {
   
   
        studentRepository.deleteById(id);
    }

    @PutMapping("/")
    public Student update(@RequestBody Student param) {
   
   
        Student save = studentRepository.save(param);
        return save;
    }

    @GetMapping("/{id}")
    public Student get(@PathVariable Integer id) {
   
   
        Optional<Student> byId = studentRepository.findById(id);
        return byId.get();
    }

    @GetMapping("/")
    public List<Student> find() {
   
   
        List<Student> all = studentRepository.findAll();
        return all;
    }

    @GetMapping("/biz")
    public void findBiz() {
   
   
        List<Student> c = studentRepository.findByUserName("string");
        log.info("查询结果为:" + JSON.toJSONString(c));
        List<Student> like = studentRepository.findByPassWordLike("123");
        log.info("查询结果为:" + JSON.toJSONString(like));
        List<Student> list = studentRepository.findList(9);
        log.info("查询结果为:" + JSON.toJSONString(list));
    }


}

findBiz 接口打印的日志为:



2023-07-18 14:21:46.105 DEBUG 29044 --- [nio-8080-exec-3] o.s.d.m.r.query.MongoQueryCreator        : Created query Query: { "userName" : "string"}, Fields: {}, Sort: {}
2023-07-18 14:21:46.106 DEBUG 29044 --- [nio-8080-exec-3] o.s.data.mongodb.core.MongoTemplate      : find using query: { "userName" : "string"} fields: Document{
  
  {}} for class: class com.ramble.mongodb.model.Student in collection: students
2023-07-18 14:21:46.110  INFO 29044 --- [nio-8080-exec-3] c.r.m.controller.StudentController       : 查询结果为:[{"age":0,"createTime":1689657852733,"id":222,"passWord":"string","userName":"string"},{"age":0,"createTime":1689657852733,"id":333,"passWord":"string","userName":"string"}]
2023-07-18 14:21:46.111 DEBUG 29044 --- [nio-8080-exec-3] o.s.d.m.r.query.MongoQueryCreator        : Created query Query: { "passWord" : { "$regularExpression" : { "pattern" : "123", "options" : ""}}}, Fields: {}, Sort: {}
2023-07-18 14:21:46.112 DEBUG 29044 --- [nio-8080-exec-3] o.s.data.mongodb.core.MongoTemplate      : find using query: { "passWord" : { "$regularExpression" : { "pattern" : "123", "options" : ""}}} fields: Document{
  
  {}} for class: class com.ramble.mongodb.model.Student in collection: students
2023-07-18 14:21:46.114  INFO 29044 --- [nio-8080-exec-3] c.r.m.controller.StudentController       : 查询结果为:[{"age":20,"createTime":1689659233455,"id":202,"passWord":"123456","userName":"cr8"}]
2023-07-18 14:21:46.115 DEBUG 29044 --- [nio-8080-exec-3] o.s.d.m.r.query.StringBasedMongoQuery    : Created query Document{
  
  {age=Document{
  
  {$gt=9}}}} for Document{
  
  {}} fields.
2023-07-18 14:21:46.115 DEBUG 29044 --- [nio-8080-exec-3] o.s.data.mongodb.core.MongoTemplate      : find using query: { "age" : { "$gt" : 9}} fields: Document{
  
  {}} for class: class com.ramble.mongodb.model.Student in collection: students
2023-07-18 14:21:46.117  INFO 29044 --- [nio-8080-exec-3] c.r.m.controller.StudentController       : 查询结果为:[{"age":100,"createTime":1689659233455,"id":22,"passWord":"string","userName":"c8"},{"age":20,"createTime":1689659233455,"id":232,"passWord":"string","userName":"cr8"},{"age":20,"createTime":1689659233455,"id":202,"passWord":"123456","userName":"cr8"}]

通过log可以观察到 MongoRepository 自动生成的查询语句以及 Query 方法生成的查询语句

MongoTemplate

除了 MongoRepository ,MongoTemplate 也可以用来访问 mongodb ,这种方式更加原始,需要开发人员编写的代码更多,但同时它的可自定义程度更高,可以用来编写复杂的查询语句。



package com.ramble.mongodb.repository;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import com.ramble.mongodb.model.FirstMongoDBSchemeCollection;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.List;

@Repository
public class FirstMongoDBSchemeCollectionRepositoryImpl implements FirstMongoDBSchemeCollectionRepository {
   
   

    @Resource
    private MongoTemplate mongoTemplate;

    public void insert(FirstMongoDBSchemeCollection model) {
   
   
        FirstMongoDBSchemeCollection insertResult = mongoTemplate.insert(model);
    }

    @Override
    public void save(FirstMongoDBSchemeCollection model) {
   
   
        FirstMongoDBSchemeCollection saveResult = mongoTemplate.save(model);
    }

    @Override
    public void remove(FirstMongoDBSchemeCollection model) {
   
   
        DeleteResult deleteResult = mongoTemplate.remove(model);
        //mongoTemplate.remove
    }

    @Override
    public void update(FirstMongoDBSchemeCollection model) {
   
   
        Query query = new Query(Criteria.where("id").is(model.getId()));
        Update update = new Update();
        update.set("name", model.getName());
        update.set("age", model.getAge());
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, FirstMongoDBSchemeCollection.class);
    }

    @Override
    public FirstMongoDBSchemeCollection findById(String id) {
   
   
        Query query = new Query(Criteria.where("id").is(id));
        FirstMongoDBSchemeCollection model = mongoTemplate.findById(id, FirstMongoDBSchemeCollection.class);
        return model;
    }

    @Override
    public FirstMongoDBSchemeCollection findOne(FirstMongoDBSchemeCollection model) {
   
   
        Query query = new Query();
        FirstMongoDBSchemeCollection findResult = mongoTemplate.findOne(query, FirstMongoDBSchemeCollection.class);
        return findResult;
    }

    @Override
    public List<FirstMongoDBSchemeCollection> findList() {
   
   
        Query query = new Query();
        List<FirstMongoDBSchemeCollection> firstMongoDBSchemeCollections = mongoTemplate.find(query, FirstMongoDBSchemeCollection.class);
        return firstMongoDBSchemeCollections;
    }
}

引用

目录
相关文章
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
NoSQL Java MongoDB
SpringBoot中MongoDB的那些高级用法
本文探讨了在Spring Boot项目中使用MongoDB的多种方式及其高级用法。MongoDB作为一种NoSQL数据库,在某些场景下相较于SQL数据库有着独特的优势。文中详细介绍了在Spring Boot中使用MongoDB的三种主要方式:直接使用官方SDK、使用Spring JPA以及使用MongoTemplate,并对比分析了它们之间的差异。此外,文章深入讲解了Spring Data MongoDB提供的各种注解(如@Id, @Document, @Field等)以简化操作流程,并探讨了MongoTemplate监听器的应用,如设置主键值、记录日志等。
953 2
|
SQL NoSQL Java
springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作
本文介绍了如何在Spring Boot中操作NoSQL数据库MongoDB,包括在MongoDB官网创建服务器、配置Spring Boot项目、创建实体类、仓库类、服务类和控制器类,以及如何进行测试。
295 1
springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
400 0
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
1161 6
|
NoSQL Java 关系型数据库
MongoDB保姆级指南(下):无缝集成SpringData框架,一篇最全面的Java接入指南!
前面的两篇文章已经将MongoDB大多数知识进行了阐述,不过其中的所有内容,都基于原生的MongoDB语法在操作。可是,在实际的日常开发过程中,我们并不会直接去接触MongoDB,毕竟MongoDB只能算作是系统内的一个组件,无法仅依靠它来搭建出一整套系统。
829 1
|
NoSQL Java MongoDB
SpringBoot中MongoDB的那些骚操作用法
MongoDB作为一种NoSQL数据库,在不需要传统SQL数据库的表格结构的情况下,提供了灵活的数据存储方案。在Spring Boot中可以通过官方SDK、Spring JPA或MongoTemplate等方式集成MongoDB。文章重点介绍了Spring Data MongoDB提供的注解功能,例如`@Id`、`@Document`和`@Field`等,这些注解简化了Java对象到MongoDB文档的映射。此外,文中还讨论了MongoTemplate监听器的使用,包括设置主键值和日志记录等高级特性。
583 0
SpringBoot中MongoDB的那些骚操作用法
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
998 4
|
NoSQL Java MongoDB
MongoDB 读写分离——SpringBoot读写分离
MongoDB 读写分离——SpringBoot读写分离
363 0

相关产品

  • 云数据库 MongoDB 版
  • 推荐镜像

    更多