spring boot mongodb 数组 查询_使用Spring Boot为MongoDb自动生成字段

快,关注这个公众号,一起涨姿势~

ceb76fd32af8a0d87c222e3fb48e241d.png

热点推荐

1.2019,我们先定一个小目标

2.Spring Security OAuth2.0(一):开发指南

3.Spring Cloud微服务 V2.0.0视频

4.全宇宙最新最全视频首次曝光

5.https://gitee.com/StarskyBoy/cloud

6.https://github.com/StarskyBoy/cloud

作者:baeldung

来自:https://www.baeldung.com/spring-boot-mongodb-auto-generated-field

如需转载请在文中注明来源和作者

使用Spring Boot为MongoDb自动生成字段

1.什么是MongoDB?

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

b0e8d4871b050fd368db0878b433f42d.png

2.主要特点

  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。

  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。

  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。

  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。

  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。

  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。

  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。

  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。

  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。

  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。

  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。

  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。

  • MongoDB安装简单。

3.概览

如何在Spring Boot中为MongoDB实现一个连续的、自动生成的字段。当使用MongoDB作为Spring Boot 应用程序的数据库时,我们不能在模型中使用@GeneratedValue注解,因为它不可用。因此,我们需要一种方法来产生与使用JPA和SQL数据库相同的效果。

这个问题的解决方案通常很简单。我们将创建一个集合(表),它将为其他集合存储生成的序列。在创建新记录时我们将使用它的下一个值。

4.依赖

添加如下配置到pom.xml

       org.springframework.boot

       spring-boot-starter-web

       2.1.0.RELEASE

       org.springframework.boot

       spring-boot-starter-data-mongodb

       2.1.0.RELEASE

最新版本依赖参看spring-boot-starter-parent

5.集合

正如在概述中所讨论,我们将创建一个集合来存储其他集合的自动递增序列。我们将这个集合称为database_sequence。它可以使用mongo shell或MongoDB Compass创建。让我们创建一个相应的模型类:

@Document(collection = "database_sequences")

public class DatabaseSequence {

   @Id

   private String id;

   private long seq;

   //getters and setters omitted

}

然后,我们创建一个用户集合和一个相应的模型对象,它将存储使用我们系统的人的详细信息:

@Document(collection = "users")

public class User {

   @Transient

   public static final String SEQUENCE_NAME = "users_sequence";

   @Id

   private long id;

   private String email;

   //getters and setters omitted

}

在上面用户模型创建中,我们添加了一个静态字段SEQUENCE_NAME, 它是对用户集合的自动递增序列的一个引用。我们也用@Transient注解它,防止它与其他属性一起持久化。

6.创建一条新记录

到此我们已经创建了需求的集合和模型,现在我们准备创建一个服务,它将生成可作为实体id的自动递增值。我们创建拥有generateSequence()方法的SequenceGeneratorService服务

public long generateSequence(String seqName) {

   DatabaseSequence counter = mongoOperations.findAndModify(query(where("_id").is(seqName)),

     new Update().inc("seq",1), options().returnNew(true).upsert(true),

     DatabaseSequence.class);

   return !Objects.isNull(counter) ? counter.getSeq() : 1;

}

现在我们在创建新记录的时候能使用方法generateSequence()

User user = new User();

user.setId(sequenceGenerator.generateSequence(User.SEQUENCE_NAME));

user.setEmail("john.doe@example.com");

userRepository.save(user);

使用UserRepository来遍历所有用户。

List<User> storedUsers = userRepository.findAll();

storedUsers.forEach(System.out::println);

现在,每次创建模型的新实例时,我们都必须设置id字段。我们可以通过为Spring Data MongoDB生命周期事件创建侦听器来绕过这个过程。为此,我们将创建一个UserModelListener,它扩展AbstractMongoEventListener,然后重写onBeforeConvert():

@Override

public void onBeforeConvert(BeforeConvertEvent<User> event) {

   event.getSource().setId(sequenceGenerator.generateSequence(User.SEQUENCE_NAME));

}

每次保存新用户的时候,ID都会自动设置。

7.结论

最后,我们了解了如何为id字段生成连续的、自动递增的值,并模拟SQL数据库中相同的行为。Hibernate在默认情况下使用类似的方法来生成自动递增的值。像往常一样,完整的源代码可以在Github上获得。

https://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-boot-persistence-mongodb

50dcb0f4e4815a77452e7aac0f924f2f.png

 END!

70c7f817b0a2e75533659f44a8451e47.png

有兴趣一起交流的小伙伴,可进QQ群727542913,添加个人微信midouJava。

cc4c73a76f60f3041ad25c9e16eb8cfb.png 32d619a5d595520a1c11ee27ed4e760d.png

请留下你指尖的温度

让太阳拥抱你

记得这是一个有温度的公众号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值