SpringBoot集成MongoDB

​欢迎光临我的博客查看最新文章: https://river106.cn

1、MongoDB简介

MongoDB 是一个开源的、高性能、无模式(schema-free)的文档型数据库,它属于 NoSQL 数据库的一种。MongoDB 的设计初衷是为了简化开发和方便扩展,同时提供可扩展的高性能数据存储解决方案。

以下是 MongoDB 的一些关键特点:

  • 面向文档:MongoDB 中的数据以文档的形式存储,这些文档是键值对的集合,类似于 JSON 对象但使用的是 BSON(Binary JSON)格式,这使得它可以存储复杂的数据类型。
  • 无模式(Schema-less):与关系型数据库不同,MongoDB 不需要预先定义固定的表结构,每个文档可以有不同的字段和数据类型。
  • 高可用性和扩展性:MongoDB 支持自动分片(sharding),这有助于水平扩展,能够处理大量的数据和高并发访问。
  • 丰富的查询语言:MongoDB 提供了强大的查询能力,其语法接近于面向对象的查询语言,支持复杂的查询操作,包括排序、聚合等。
  • 索引支持:为了加快查询速度,MongoDB 支持对字段创建索引,包括单字段索引、复合索引、地理空间索引等。
  • 复制和容错:通过副本集(replica set),MongoDB 可以实现数据的冗余存储,提高系统的可靠性和容错能力。
  • 易于使用和集成:MongoDB 提供了多种编程语言的驱动程序,方便开发者进行应用开发,并且拥有图形化管理工具如 Compass、Navicat、Studio 3T等来辅助数据库管理和维护。
  • 社区和支持:作为一个广泛使用的数据库系统,MongoDB 拥有一个活跃的社区和官方提供的商业支持服务。

MongoDB 被设计用来满足现代应用程序的需求,特别是那些需要处理大量非结构化或半结构化数据的应用场景,比如内容管理系统、实时分析、移动应用后端等。由于其灵活性和性能优势,MongoDB 成为许多开发者和企业的首选数据库解决方案之一。

2、MongoDB安装

Linux安装

下载MongoDB Community Server

下载地址:https://www.mongodb.com/try/download/community

解压后启动MongoDB Server

shell 复制代码
#创建dbpath和logpath
mkdir -p /mongodb/data /mongodb/log  
#进入mongodb目录,启动mongodb服务
bin/mongod --port=27017 --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log

3、SpringBoot集成MongoDB

3.1、环境准备

1、引入依赖

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

完整依赖如下:

复制代码
 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.9</version>
    </dependency>

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

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.68</version>
    </dependency>
  </dependencies>

2、配置

application.properties

properties 复制代码
# MongoDB
spring.data.mongodb.host = 127.0.0.1
spring.data.mongodb.port = 27017
spring.data.mongodb.database = test
spring.data.mongodb.auto-index-creation = true

# 或者直接使用uri方式
#spring.data.mongodb.uri=mongodb://user:password@127.0.0.1:27017/test?authSource=admin

# 打印mongoDB日志
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
logging.level.org.mongodb.driver.connection=DEBUG

连接配置可参考文档 https://www.mongodb.com/zh-cn/docs/manual/reference/connection-string/

3.2、文档操作

1、新增实体

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(collection = "person") // 指定集合名称
public class Person {
    @Id  // 映射文档中的_id
    private Long id;
    private String name;
    private Integer age;
}

2、添加集合文档

集合操作时注入MongoTemplate

java 复制代码
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class InsertTests {
    
    @Resource
    private MongoTemplate mongoTemplate;

    @Test
    public void testInsert() {
        Person person = Person.builder().id(2L).name("river").age(18).build();
        mongoTemplate.insert(person);

        // 如果有就修改, 没有就插入
        mongoTemplate.save(Person.builder().id(2L).name("zhangsan").age(28).build());

        // 批量写入
        List<Person> persons = new ArrayList<>();
        for (int i = 100; i <= 150; i++) {
            person = Person.builder().id(Long.valueOf(i)).name("lisi" + i).age(i).build();
            persons.add(person);
        }
        mongoTemplate.insertAll(persons);
    }
}

插入数据时: insert插入的_id 不能有重复,否则会报 DuplicateKeyException 提示主键重复; save对已存在的数据进行更新;

批处理操作时: insertAll可以一次性插入所有数据,效率较高;save需遍历所有数据,一次插入或更新,效率较低。

3、查询集合文档

java 复制代码
@Slf4j
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class QueryTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void find() {
        // 查询集合中的全部文档数据
        List<Person> personList = mongoTemplate.findAll(Person.class);
        log.info("查询结果:{}", personList);

        // 查询集合中指定的ID文档数据
        Person byId = mongoTemplate.findById(1L, Person.class);
        log.info("查询结果:{}", byId.toString());

        // 根据条件查询符合条件的文档数据并返回第一条数据
        Query query = new Query(Criteria.where("name").is("river"));
        Person result = mongoTemplate.findOne(query, Person.class);
        log.info("查询结果:{}", result);

        // 根据条件查询所有符合条件的文档
        query = new Query(Criteria.where("age").gt(18));
        List<Person> list = mongoTemplate.find(query, Person.class);
        log.info("查询结果:{}", list);

        // 创建查询对象,然后将条件对象添加到其中
        Criteria criteria = Criteria.where("age").gt(18).lte(30);
        query = new Query(criteria);
        list = mongoTemplate.find(query, Person.class);
        log.info("查询结果:{}", list);

        Criteria name = Criteria.where("name").is("zhangsan");
        Criteria age = Criteria.where("age").is(18);
        // 创建条件对象,将上面条件进行 AND 关联
        criteria = new Criteria().andOperator(name, age);
        query = new Query(criteria);
        list = mongoTemplate.find(query, Person.class);
        log.info("查询结果:{}", list);

        // 从第5行开始,查询3条数据返回
        query = new Query(Criteria.where("age").is("20"))
                .with(Sort.by("id"))
                .limit(3).skip(5);
        list = mongoTemplate.find(query, Person.class);
        log.info("查询结果:{}", list);
    }
}

Criteria是标准查询的接口,可以引用静态的Criteria.where的把多个条件组合在一起,就可以轻松地将多个方法查询连接起来,方便我们操作查询语句。

4、更新集合文档

java 复制代码
@Slf4j
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class UpdateTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void update() {
        Person person = mongoTemplate.findById(1L, Person.class);
        person.setName("wangwu");
        mongoTemplate.save(person);

        Query query = new Query(Criteria.where("id").is(1L));
        // 修改内容
        Update update = new Update().set("name", "lisi");
        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Person.class);
//        // 只更新满足条件的第一条记录
//        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Person.class);

        // 没有符合条件的记录则插入数据
//       //  update.setOnInsert("id",11);  // 指定_id
//        updateResult = mongoTemplate.upsert(query, update, Person.class);

        // 返回修改的记录数
        log.info("updateResult: {}", updateResult.getModifiedCount());

    }
}

如果更新后的结果和更新前的结果是相同,返回0。

updateFirst() 只更新满足条件的第一条记录

updateMulti() 更新所有满足条件的记录

upsert() 没有符合条件的记录则插入数据

5、删除集合文档

java 复制代码
@Slf4j
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class DeleteTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void delete() {
        // 删除id为1的记录
        Query query = new Query(Criteria.where("id").is(1L));
        DeleteResult remove = mongoTemplate.remove(query, Person.class);
        log.info("删除的条数为:{}", remove.getDeletedCount());

        // 删除符合条件的单个文档并返回删除的文档
        query = new Query(Criteria.where("id").is(2L));
        Person per = mongoTemplate.findAndRemove(query, Person.class);
        log.info("删除的文档: {}", per);
    }
}

3.3、去掉_class属性

使用MongoTemplate写入文档时,会自动将_class属性添加到文档中,一般不需要使用_class属性,可以配置去掉_class属性。

java 复制代码
@Configuration
public class MongoConfig {

    @Bean("mongoTemplate")
    public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoMappingContext mongoMappingContext) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
        MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
        // 去掉_class字段
        mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return new MongoTemplate(mongoDbFactory, mappingMongoConverter);
    }
}
相关推荐
IT_陈寒3 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码4 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo5 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志5 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..5 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects6 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰6 小时前
一些基础和问题解决
后端
陈随易6 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN6 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana6 小时前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端