SpringBoot整合MongoDB

这篇具有很好参考价值的文章主要介绍了SpringBoot整合MongoDB。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


提示:以下是本篇文章正文内容,MongoDB 系列学习将会持续更新

SpringBoot整合MongoDB

一、环境准备

①添加 SpringData 依赖:

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

②配置 yml 文件,官方连接配置文档

方式一:

spring:
  data:
    mongodb:
      uri: mongodb://root:123456@1.15.76.95:27017/library?authSource=admin

方式二:

spring:
  data:
    mongodb:
      username: root
      password: 123456
      host: 1.15.76.95
      port: 27017
      database: library
      authentication-database: admin

③直接注入 MongoTemplate 进行操作

@Resource
MongoTemplate mongoTemplate;

二、集合操作

@Test
public void testCollection(){
	boolean exists = mongoTemplate.collectionExists("borrow");
	if(exists) {
		// 删除集合
		mongoTemplate.dropCollection("borrow");
	}else {
		// 创建集合
		mongoTemplate.createCollection("borrow");
	}
	Set<String> collectionNames = mongoTemplate.getCollectionNames();
    System.out.println(collectionNames.toString());  // [borrow, book, user]
}

回到目录…

三、文档操作

3.1 实体类

  • @Document
    • 修饰范围:用在类上。
    • 作用:用来映射这个类的一个对象为 Mongo 中一条文档数据。
    • 属性:(value 、collection) 用来指定操作的集合名称。
  • @MongoId
    • 修饰范围:用在成员变量、方法上。
    • 作用:用来将成员变量的值映射为文档的 _id 的值。
  • @Field
    • 修饰范围:用在成员变量、方法上。
    • 作用:用来将成员变量及其值映射为文档中一个 key:value 对。
    • 属性:(name , value) 用来指定在文档中 key 的名称,默认为成员变量名。
  • @Transient
    • 修饰范围:用在成员变量、方法上。
    • 作用:用来指定此成员变量不参与文档的序列化。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document("user")
public class User {
    @MongoId
    private Integer uid;
    @Field
    private String name;
    @Field
    private String password;
    @Field
    private Integer age;
}

回到目录…

3.2 添加文档

insert 方法返回值是新增的 Document 对象,里面包含了新增后 id 的值。如果集合不存在会自动创建集合。

@Test
public void test1() {
    // _id存在时更新数据
    mongoTemplate.save(new User(1, "aaa", "123456", 20));
    // _id存在时抛出异常
    mongoTemplate.insert(new User(2, "bbb", "113456", 21));

    List<User> list = Arrays.asList(
            new User(3, "ccc", "124266", 22),
            new User(4, "ddd", "136521", 23),
            new User(5, "eee", "147258", 24));
    // 批量插入
    mongoTemplate.insert(list, User.class);
}

通过 Spring Data MongoDB 还会给集合中多加一个 _class 的属性,存储新增时 Document 对应 Java 中类的全限定路径。这么做为了查询时能把 Document 转换为 Java 类型。
SpringBoot整合MongoDB

回到目录…

3.3 查询文档

  • Query 类作为查询条件的容器,用于放置 Criteria 条件接口。
  • Criteria 是标准查询的接口,可以引用静态的 Criteria.where() 将字段和条件组合在一起进行查询。
@Test
public void test1() {
	System.out.println("==========查询所有文档===========");
    List<User> list = mongoTemplate.findAll(User.class);
    list.forEach(System.out::println);

    System.out.println("==========根据_id查询===========");
    User user = mongoTemplate.findById(3, User.class);
    System.out.println(user);

    System.out.println("==========findOne返回第一个文档===========");
    User one = mongoTemplate.findOne(new Query(), User.class);
    System.out.println(one);
}
@Test
public void test2() {
	System.out.println("==========条件查询===========");
	// 查询name为"eee"的用户
	Query query1 = new Query(Criteria.where("name").is("eee"));
	// 查询 age<23 的用户
	Query query2 = new Query(Criteria.where("age").lt(23));
	// 查询 21<=age<24 的用户
	Query query3 = new Query(Criteria.where("age").gte(21).lt(24));
	// 模糊查询
	Query query4 = new Query(Criteria.where("password").regex("123"));

	System.out.println("==========多条件查询===========");
	// 查询 age<24 且 密码包含"123" 的用户
	Criteria criteria1 = new Criteria();
	criteria1.andOperator(Criteria.where("age").lt(24), Criteria.where("password").regex("123"));
	Query query5 = new Query(criteria1);
	// 查询 age>23 或 密码包含"456" 的用户
	Criteria criteria2 = new Criteria();
	criteria2.orOperator(Criteria.where("age").gt(23), Criteria.where("password").regex("456"));
	Query query6 = new Query(criteria2);

	List<User> list = mongoTemplate.find(query6, User.class);
	list.forEach(System.out::println);
}
@Test
public void test3() {
	System.out.println("==========排序===========");
	Query query1 = new Query();
	query1.with(Sort.by(Sort.Order.desc("age")));

	System.out.println("==========分页===========");
	Query query2 = new Query();
	query2.skip(0).limit(3);

	List<User> list = mongoTemplate.find(query2, User.class);
	list.forEach(System.out::println);
}

使用 JSON 字符串方式查询:

@Test
public void testFindByJson() {
	// 等值查询
	Query query1 = new BasicQuery("{name:'eee'}");
	// 多条件查询
	Query query2 = new BasicQuery("{age:{$lt:24}, password:{$regex:'123'}}");
	Query query3 = new BasicQuery("{$or:[{age:{$gt:23}}, {password:{$regex:'456'}}]}");

	List<User> list = mongoTemplate.find(query3, User.class);
	list.forEach(System.out::println);
}

回到目录…

3.4 修改文档

在 Mongodb 中无论是使用客户端 API 还是使用 Spring Data,更新返回结果一定是受行数影响。如果更新后的结果和更新前的结果是相同,返回 0。

  • updateFirst():只更新满足条件的第一条记录。
  • updateMulti():更新所有满足条件的记录。
  • upsert():没有符合条件的记录则插入数据。
@Test
public void test1() {
	Query query = new Query(Criteria.where("name").is("eee"));
	Update update = new Update();
	update.set("age", 25);
	// updateFirst() 只更新满足条件的第一条记录
	UpdateResult updateResult = mongoTemplate.updateFirst(query, update, User.class);
	System.out.println("返回修改的记录数: " + updateResult.getModifiedCount());
}
@Test
public void test2() {
	Query query = new Query(Criteria.where("age").gt(23));
	Update update = new Update();
	update.inc("age", 1);
	// updateMulti() 更新所有满足条件的记录
    UpdateResult updateResult = mongoTemplate.updateMulti(query, update, User.class);
	System.out.println("返回修改的记录数: " + updateResult.getModifiedCount());
}
@Test
public void test3() {
	// query查询结果不存在
	Query query = new Query(Criteria.where("name").is("ggg"));
	Update update = new Update();
	update.set("age", 28);
	update.setOnInsert("_id", 7); //不存在时插入
	// upsert() 没有符合条件的记录则插入数据
	UpdateResult updateResult = mongoTemplate.upsert(query, update, User.class);
	System.out.println("返回修改的记录数: " + updateResult.getModifiedCount());
}

3.5 删除文档

@Test
public void testDelete() {
	//删除所有文档, 不如用dropCollection()
	//mongoTemplate.remove(new Query(),Employee.class);
        
	//条件删除
	Query query = new Query(Criteria.where("name").is("fff"));
	mongoTemplate.remove(query, User.class);
}

回到目录…

四、聚合操作

4.1 使用 Aggregation 实现

用 Aggregation 集合接收聚合操作,用 MongoTemplate 对象直接调用 aggregate,传入聚合操作集合、表名、映射对象。

@Test
public void testAggregation() {
	// 1.先定义聚合操作
	MatchOperation match = Aggregation.match(Criteria.where("type").is("novel"));
	SortOperation sort = Aggregation.sort(Sort.Direction.ASC, "favCount");
	// 2.按顺序组合每一个聚合步骤
	TypedAggregation<Book2> typedAggregation = Aggregation.newAggregation(Book2.class, match, sort);
	// 3.执行聚合操作, 可以使用 Document、Map、自定义实体类 接收结果
	AggregationResults<Document> aggregate = mongoTemplate.aggregate(typedAggregation, Document.class);
	List<Document> results = aggregate.getMappedResults();
	results.forEach(System.out::println);
}

4.2 使用 Aggregates 实现

用 Aggregates 和 Bson 构建聚合操作对象,用预先生成的 MongoCollection 对象调用 aggregate 执行。

@Test
public void testAggregates(){
	// 1.先通过集合名拿到所有文档
	MongoCollection<Document> collection = mongoTemplate.getCollection("book2");
	
	// 2.Aggregates提供各种聚合操作符,返回一个Bson对象
	Bson matchBson = Aggregates.match(new Document("type", "travel"));
//	Bson matchBson = Aggregates.match(Filters.eq("type", "travel"));//Filters来实现过滤
	Bson sortBson = Aggregates.sort(Sorts.ascending("favCount"));
//	Bson sortBson = Aggregates.sort(new Document("favCount", 1));
	
	// 3.构建一个List<Bson>, 并把每一个聚合操作按顺序加进去
	List<Bson> bsonList = new ArrayList<>();
	bsonList.add(matchBson);
	bsonList.add(sortBson);
	
	// 4.最后传入aggregate方法中执行,并且接收结果集
	AggregateIterable<Document> resultList = collection.aggregate(bsonList);
	resultList.forEach(System.out::println);
}

示例一:统计文档中的书籍总量、收藏总数、平均收藏量

@Test
public void test1() {
    MongoCollection<Document> collection = mongoTemplate.getCollection("book2");

    Bson groupBson = Aggregates.group(null,
            Accumulators.sum("bookCount", 1),
            Accumulators.sum("favCount", "$favCount"),
            Accumulators.avg("favAvg", "$favCount"));

    List<Bson> bsonList = new ArrayList<>();
    bsonList.add(groupBson);

    AggregateIterable<Document> resultList = collection.aggregate(bsonList);
    resultList.forEach(System.out::println);
}

示例二:统计tag标签的热度排行 (根据favCount总量排行即为热度)

@Test
public void test4() {
    MongoCollection<Document> collection = mongoTemplate.getCollection("book2");

    Bson unwindBson = Aggregates.unwind("$tag");
    Bson groupBson = Aggregates.group("$tag", Accumulators.sum("favCount", "$favCount"));
    Bson sortBson = Aggregates.sort(new Document("favCount", -1));

    List<Bson> bsonList = new ArrayList<>();
    bsonList.add(unwindBson);
    bsonList.add(groupBson);
    bsonList.add(sortBson);

    AggregateIterable<Document> resultList = collection.aggregate(bsonList);
    resultList.forEach(System.out::println);
}

回到目录…

4.3 应用案例

示例一:统计每个作者的每本book的收藏数

@Test
public void test1() {
    GroupOperation group = Aggregation
            .group("$author.name", "$title")
            .sum("$favCount").as("favCount");
    TypedAggregation<Book2> typedAggregation = Aggregation.newAggregation(Book2.class, group);
    AggregationResults<Document> aggregate = mongoTemplate.aggregate(typedAggregation, Document.class);
    List<Document> mappedResults = aggregate.getMappedResults();
    mappedResults.forEach(System.out::println);
}

示例二:每个作者的book的tag合集

@Test
public void test2() {
	UnwindOperation unwind = Aggregation.unwind("$tag");
    GroupOperation group = Aggregation
            .group("$author.name")
            .addToSet("$type").as("types");
    TypedAggregation<Book2> typedAggregation = Aggregation.newAggregation(Book2.class, unwind, group);
    AggregationResults<Document> aggregate = mongoTemplate.aggregate(typedAggregation, Document.class);
    List<Document> mappedResults = aggregate.getMappedResults();
    mappedResults.forEach(System.out::println);
}

示例三:联表查询用户以及对应的订单信息

@Test
public void test1() {
    LookupOperation lookup = Aggregation.lookup("order", "_id", "customerId", "order");
    TypedAggregation<Customer> orderTypedAggregation = Aggregation.newAggregation(Customer.class, lookup);
    AggregationResults<Document> aggregate = mongoTemplate.aggregate(orderTypedAggregation, Document.class);
    List<Document> mappedResults = aggregate.getMappedResults();
    mappedResults.forEach(System.out::println);
}

SpringBoot整合MongoDB

示例四:联表查询订单信息以及对应的商品项

@Test
public void test2() {
    LookupOperation lookup = Aggregation.lookup("orderItem", "_id", "orderId", "orderItem");
    TypedAggregation<Order> orderItemTypedAggregation = Aggregation.newAggregation(Order.class, lookup);
    AggregationResults<Document> aggregate = mongoTemplate.aggregate(orderItemTypedAggregation, Document.class);
    List<Document> mappedResults = aggregate.getMappedResults();
    mappedResults.forEach(System.out::println);
}

SpringBoot整合MongoDB

回到目录…


总结:
提示:这里对文章进行总结:
本文是对MongoDB的学习,SpringBoot整合MongoDB的SpringData,配置文件中如何连接,实体类如何映射到文档,如何通过API进行集合操作和文档的增删查改。之后的学习内容将持续更新!!!
文章来源地址https://www.toymoban.com/news/detail-425410.html

到了这里,关于SpringBoot整合MongoDB的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MongoDB - 整合 SpringBoot 操作全流程

    目录 一、MongoDB 整合 SpringBoot 1.1、引入依赖 1.2、配置文件 1.3、集合操作 1.4、相关注解 1.5、文档操作 1.5.1、查询 1.5.2、更新 1.5.3、删除 uri 格式为: mongodb://ip 地址:mongodb 端口号/集合名 Ps:以 demo 集合为例 a)创建集合 b)删除集合 a)@Document 修饰范围:在类上. 作用:映射当

    2024年01月17日
    浏览(23)
  • 【微服务】springboot整合mongodb使用详解

    目录 一、mongodb简介 1.1 什么是mongodb 1.2 mongodb特点 二、mongodb中的核心术语 2.1 mogodb与数据库对比

    2024年02月15日
    浏览(21)
  • springboot整合redis,MongoDB,Elasticsearch(ES)

    目录  springboot整合redis 连接Redis 字符串操作 哈希表操作 列表操作 集合操作 有序集合操作 lettcus与jedis的区别  springboot整合MongoDB 新增数据 查询数据 更新数据 删除数据  springboot整合Elasticsearch(ES) 创建ElasticsearchRepository 创建实体类 增删改查 搜索 Spring Boot整合Redis,需要使

    2024年02月05日
    浏览(31)
  • SpringBoot--中间件技术-3:整合mongodb,整合ElasticSearch,附案例含代码(简单易懂)

    实现步骤: pom文件导坐标 yaml配置文件配置mongodb: 随便建一个pojo 测试: 装配MongoTemplate模板类,调用方法 整合MongoDB总结: 导坐标 写配置文件 核心类MongoTemplate调用 前提准备:数据库+ES 数据库建表语句: 实现步骤: pom文件到坐标 yaml配置文件 创建实体类: 对应数据库表

    2024年02月04日
    浏览(37)
  • 13、MongoDB--通过 SpringBoot 整合 Spring Data MongoDB(【连接多个 MongoDB 服务器】、【高级定制 MongoDB 客户端】的简单介绍)

    放弃 Spring Boot 为 MongeDB 提供的自动配置,接下来同样要干如下事情: 手动配置多组 ReactiveMongoDatabaseFactory 和 ReactiveMongoTemplate,要连几个 MongoDB 服务器就配置几组。 同步 API 则使用 MongoDatabaseFactory 和 MongoTemplate。 针对不同 MongoDB 服务器,分别开发相应的 DAO 组件类,建议将它

    2024年03月19日
    浏览(48)
  • java springboot整合Mongodb 对数据库集合进行增删查改操作

    下面 我们就来做 springboot 整合Mongodb的工作 我们终端打开 Mongodb 安装目录下的bin目录 然后执行 启动服务 然后 打开我们的 springboot 项目 在pom.xml 文件中 导入坐标 有了依赖之后 就还差配置 打开项目中的 application 配置文件 我这里用的 yml 格式 我们在上面 打个 mong 它就会弹出

    2024年01月18日
    浏览(43)
  • 【已解决】SpringBoot整合security账号密码正确却提示错误

    SpringSecurity的密码校验并不是直接使用原文进行比较,而是使用加密算法将密码进行加密(更准确地说应该进行Hash处理,此过程是不可逆的,无法解密),最后将用户提供的密码以同样的方式加密后与密文进行比较。对于我们来说,用户提供的密码属于隐私信息,直接明文存

    2024年02月11日
    浏览(33)
  • SpringBoot整合es提示错误:ElasticsearchException[Invalid or missing build flavor [oss]]

    SpringBoot整合es提示错误:ElasticsearchException[Invalid or missing build flavor [oss]] 问题属于Springboot中引入的es版本与es服务版本不一致导致,当前项目引入es版本为 7.17.4 ,服务器版本为 7.8.1 ,版本修改统一即可;

    2024年02月13日
    浏览(30)
  • 开发微信小程序时,提示不在以下 request 合法域名列表中

    如何解决这个问题呢? ** ** 在开发微信小程序的时候,注册的时候都会有一个appid,这时候分两种情况: (1)申请的测试环境,会分配一个测试用的appid (2)有真正的appid 解决方案: (1)打开微信开发者工具,找到右上角的\\\"详情\\\"后点击 (2) 找到本地设置,选中不校验合法域名、

    2024年02月15日
    浏览(38)
  • 开发微信小程序时,提示不在以下 request 合法域名列表中怎么办

    当开发微信小程序时,可能会出现以下提示:“request:fail url not in domain list(request:fail,当前请求域名不在后台配置中,请确保请求域名在小程序后台配置中)”。这是因为微信小程序的请求域名必须经过后台配置并且必须是合法的域名。 要解决此问题,您需要将您的请求

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包