跳至主要內容

Mongo-SpringBoot集成

Zenghr大约 3 分钟

Mongo 集成 SpringBoot

开发环境配置如下👇

框架版本
SpringBoot2.5.4
mongodb5.0.2
spring-boot-starter-data-mongodb2.5.4

导入 pom 文件

我们想要在 SpringBoot 中集成 mongo,第一步☝️就是导入相应的 pom 文件

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

配置文件

spring:
  data:
    # mongodb 配置
    mongodb:
      database: xxx
      host: 127.0.0.1
      port: 27017

开启注解

@EnableMongoRepositories(basePackages = "xx.xxx.xxx")

因为使用了 Spring-data 框架,所以需要开启注解扫描 Repository 类

编写对应的 JavaBean

先定义一个 JavaBean 类,指定集合名称

@Data
@Document("entries")
// 为序列化中的属性选择命名策略
// 所有字母均为小写,并在名称元素之间使用下划线作为分隔符
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class Entry {
    @Id
    private String id;
    private String title;
    private String link;
    @Field("image_url")
    private String imageUrl;
    @Field("icon_url")
    private String iconUrl;
    @Field("title_color")
    private String titleColor;
    private String description;
    private int price;
    @Field("is_in_serving")
    private String isInServing;
}

创建 Repository

Spring Data 的强大之处,就在于你不用写任何DAO处理,自动根据方法名或类的信息进行CRUD操作。只要你定义一个接口,然后继承Repository提供的一些子接口,就能具备各种基本的CRUD功能

@Repository
public interface EntryRepository extends CrudRepository<Entry, String> {
}

mongoTemplate API 方法大全

Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库。本文介绍使用Spring Data MongoDB来访问mongodb数据库的几种方法:

  • 使用Query和Criteria类
  • JPA自动生成的查询方法
  • 使用@Query 注解基于JSON查询

使用Spring Data来查询MongoDB的最常用方法之一是使用 QueryCriteria

is 查询

在以下示例中 - 我们正在寻找 title 名为 果蔬生菜 的数据

Query query = new Query();
query.addCriteria(Criteria.where("title").is("果蔬生菜"));
List<Entry> entrys = mongoTemplate.find(query, Entry.class);

模糊查询 - 正则

在以下示例中 - 我们正在寻找 title、和 description 中带有 早餐 的数据

//模糊匹配
Pattern pattern = Pattern.compile(".*?早餐.*?");
query.addCriteria(Criteria.where("")
              .orOperator(Criteria.where("title").regex(pattern),Criteria.where("description").regex(pattern)));
List<Entry> entrys = mongoTemplate.find(query, Entry.class);

LT和GT

$ lt(小于)运算符和$ gt(大于)

举个🌰 - 查找价格在 100 ~ 500 之间的数据

Query query = new Query();
query.addCriteria(Criteria.where("price").lt(100).gt(500));
List<Entry> users = mongoTemplate.find(query, Entry.class);

结果排序

Sort 用于指定结果的排序顺序

在以下示例中 - 根据价格来排序

Query query = new Query();
query.with(new Sort(Sort.Direction.ASC, "price"));
List<Entry> entrys = mongoTemplate.find(query, Entry.class);

分页

一个使用分页的简单例子 - 每页显示 5 条数据,且根据价格排序

// 排序
Sort sort = new Sort(Sort.Direction.ASC, "price")
Pageable pageableRequest = new PageRequest(0, 5, sort);
Query query = new Query();
query.with(pageableRequest);
List<Entry> entrys = mongoTemplate.find(query, Entry.class);

Repository 使用

生成查询方法是JPA的一个特性,在Spring Data Mongodb里也可以使用

FindByX

通过 title 查找,只需要在接口上声明方法即可

@Repository
public interface EntryRepository extends CrudRepository<Entry, String> {
    List<Entry> findByTitle(String title);
}

StartingWith and endingWith

List<Entry> findByTitleStartingWith(String regexp);
List<Entry> findByTitleEndingWith(String regexp);

Between

类似价格区间查询我们可以使用 Between :

List<Entry> findByPriceBetween(int minPrice, int maxPrice);
List<Entry> entrys = entryRepository.findByPriceBetween(100, 500);

Like和OrderBy

示例 - 我们将要查找 title 中包含 早餐 的所有数据,我们也将按 价格 顺序排列结果:

List<Entry> entrys = entryRepository.findByTitleLikeOrderByPriceAsc("早餐");

原始查询

使用@Query注解 - 我们可以指定一个原始查询 - 作为一个Mongo JSON查询字符串

FindBy

@Query("{ 'title' : ?0 }")
List<Entry> findEntryByTitle(String title);

$regex

正则表达式驱动的查询

@Query("{ 'title' : { $regex: ?0 } }")
List<Entry> findEntryByRegexpTitle(String regexp);