MongoDB - 整合 SpringBoot 操纵全流程

打印 上一主题 下一主题

主题 513|帖子 513|积分 1549

目录
一、MongoDB 整合 SpringBoot
1.1、引入依赖
1.2、设置文件
1.3、集合操纵
1.4、相关注解
1.5、文档操纵
Tips:紧张提示
1.5.1、查询
1.5.2、分页查询 + 排序
1.5.3、更新
1.5.4、删除
1.6、事务


一、MongoDB 整合 SpringBoot


1.1、引入依赖

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

1.2、设置文件

  1. spring:
  2.   data:
  3.     mongodb:
  4.       uri: mongodb://192.168.73.3:27017/demo
  5.       field-naming-strategy: org.springframework.data.mapping.model.SnakeCaseFieldNamingStrategy # 自动转驼峰
  6. #      mongodb 一般不设置密码
  7. #      username: root
  8. #      password: 1111
复制代码
uri 格式为: mongodb://ip 地点:mongodb 端口号/集合名

1.3、集合操纵

   Ps:以 demo 集合为例
  a)创建集合
  1.         if(!mongoTemplate.collectionExists("demo")) {
  2.             //不存在才能创建,如果以及存在再创建就会报错
  3.             mongoTemplate.createCollection("demo");
  4.         }
复制代码

b)删除集合
  1.         mongoTemplate.dropCollection("demo1");
复制代码

1.4、相关注解

a)@Document


  • 修饰范围:在类上.
  • 作用:映射当前类的一个对象为 mongo 的一条文档.
  • 属性:value 和 collection 都是用来表示操纵的集合名.
b)@Id


  • 修饰范围:成员变量、方法.
  • 作用:将值映射成文档的 _id.
c)@Field


  • 修饰范围:成员变量、方法.
  • 作用:将值映射为文档中的一个 key 名称.
d)@Transient


  • 修饰范围:成员变量、方法.
  • 租用:指定值不参与文档序列化.
以 User 类为例:
  1. @Document("demo") //表示当前文档属于哪个集合
  2. public class User {
  3.     @Id //当前类的 id 映射文档中的 _id
  4.     private Integer id;
  5.     private String name;
  6.     private Integer age;
  7.     @Field("work_day")  //当前类的 workDay 映射文档中的 work_day
  8.     private Date workDay;
  9.     public User(Integer id, String name, Integer age, Date workDay) {
  10.         this.id = id;
  11.         this.name = name;
  12.         this.age = age;
  13.         this.workDay = workDay;
  14.     }
  15.     @Override
  16.     public String toString() {
  17.         return "User{" +
  18.                 "id=" + id +
  19.                 ", name='" + name + '\'' +
  20.                 ", age=" + age +
  21.                 ", workDay=" + workDay +
  22.                 '}';
  23.     }
  24.     public Integer getId() {
  25.         return id;
  26.     }
  27.     public void setId(Integer id) {
  28.         this.id = id;
  29.     }
  30.     public String getName() {
  31.         return name;
  32.     }
  33.     public void setName(String name) {
  34.         this.name = name;
  35.     }
  36.     public Integer getAge() {
  37.         return age;
  38.     }
  39.     public void setAge(Integer age) {
  40.         this.age = age;
  41.     }
  42.     public Date getWorkDay() {
  43.         return workDay;
  44.     }
  45.     public void setWorkDay(Date workDay) {
  46.         this.workDay = workDay;
  47.     }
  48. }
复制代码

1.5、文档操纵

Tips:紧张提示

mongo 对类型有严格的要求.  比方根据 id 查询用户,你利用 String 类型的 id 作为 查询的参数,而 mongo 文档中保存的是 Long 类型的参数,此时你的查询记不起作用.
这点需要跟 MySQL 区分开!!!

1.5.1、查询

  1.         //1.查询所有
  2.         System.out.println("------------------------------------------------");
  3.         List<User> users = mongoTemplate.findAll(User.class);
  4.         users.forEach(System.out::println);
  5.         //2.根据 id 查询指定文档
  6.         System.out.println("------------------------------------------------");
  7.         User byId = mongoTemplate.findById(1, User.class);
  8.         System.out.println(byId);
  9.         //3.根据查询条件进行查询(参数1: 查询条件, 参数2: 返回类型)
  10.         System.out.println("------------------------------------------------");
  11. //        mongoTemplate.find(new Query(), User.class);  //没有查询条件就是查询所有
  12.         //a) 等值查询
  13.         System.out.println("------------------------------------------------");
  14.         List<User> users1 = mongoTemplate.find(Query.query(Criteria.where("name").is("周杰伦")), User.class);
  15.         users1.forEach(System.out::println);
  16.         //b) > 查询: gt()、>= 查询: gte() 、 < 查询: lt()、<= 查询 lte() 查询
  17.         //以 > 为例
  18.         System.out.println("------------------------------------------------");
  19.         List<User> users2 = mongoTemplate.find(Query.query(Criteria.where("age").gt(30)), User.class);
  20.         users2.forEach(System.out::println);
  21.         //4.and 查询
  22.         System.out.println("------------------------------------------------");
  23.         List<User> users3 = mongoTemplate.find(Query.query(Criteria.where("name").is("薛之谦").and("age").is(40)), User.class);
  24.         users3.forEach(System.out::println);
  25.         //5.or 查询
  26.         System.out.println("------------------------------------------------");
  27.         Criteria criteria = new Criteria();
  28.         criteria.orOperator(
  29.         Criteria.where("name").is("周杰伦"),
  30.                 Criteria.where("name").is("薛之谦")
  31.         );
  32.         List<User> users4 = mongoTemplate.find(Query.query(criteria), User.class);
  33.         users4.forEach(System.out::println);
  34.         //6.and 和 or
  35.         System.out.println("------------------------------------------------");
  36.         Criteria criteria1 = new Criteria();
  37.         criteria1.and("age").is(40)
  38.                 .orOperator(
  39.                         Criteria.where("name").is("周杰伦"),
  40.                         Criteria.where("name").is("薛之谦")
  41.                 );
  42.         List<User> users5 = mongoTemplate.find(Query.query(criteria1), User.class);
  43.         users5.forEach(System.out::println);
  44.         //7.sort
  45.         System.out.println("------------------------------------------------");
  46.         Query query = new Query();
  47.         query.with(Sort.by(Sort.Order.desc("age"))); //desc 降序, asc 升序
  48.         mongoTemplate.find(query, User.class);
  49.         //8.分页: skip limit
  50.         System.out.println("------------------------------------------------");
  51.         Query queryPage = new Query();
  52.         queryPage.with(Sort.by(Sort.Order.desc("age"))) //desc 降序, asc 升序
  53.                 .skip(0)
  54.                 .limit(3);
  55.         mongoTemplate.find(queryPage, User.class);
  56.         //9.总数
  57.         System.out.println("------------------------------------------------");
  58.         mongoTemplate.count(new Query(), User.class);
  59.         //10.去重 distinct(参数1: 查询条件, 参数2: 去重字段, 参数3: 操作集合, 参数4: 返回类型)
  60.         System.out.println("------------------------------------------------");
  61.         List<String> name = mongoTemplate.findDistinct(new Query(), "name", User.class, String.class);
  62.         //11.json 字符串查询
  63.         System.out.println("------------------------------------------------");
  64.         Query queryJson = new BasicQuery("{name: '周杰伦', age: '20'}");
  65.         List<User> users6 = mongoTemplate.find(queryJson, User.class);
复制代码

1.5.2、分页查询 + 排序

  1.     public List<MyDocument> findPaginated(int page, int size) {  
  2.         // 创建查询对象  
  3.         Query query = new Query();  
  4.   
  5.         // 添加过滤条件,如果有的话  
  6.         // query.addCriteria(Criteria.where("fieldName").is("value"));  
  7.   
  8.         // 添加排序条件,如果有的话  
  9.         // query.with(Sort.by(Sort.Direction.ASC, "fieldName"));  
  10.   
  11.         // 计算跳过的文档数量  
  12.         long skip = (page - 1) * size;  
  13.   
  14.         // 设置查询的起始位置和返回的数量  
  15.         query.skip(skip).limit(size);  
  16.   
  17.         // 执行查询并返回结果  
  18.         return mongoTemplate.find(query, MyDocument.class, "collectionName");  
  19.     }
复制代码

1.5.3、更新

更新指定字段的值.
  1.         //1.更新条件
  2.         Query query = Query.query(Criteria.where("name").is("周杰伦"));
  3.         //2.更新内容
  4.         Update update = new Update();
  5.         update.set("age", 20);
  6.         //a) 更新单条
  7.         mongoTemplate.updateFirst(query, update, User.class);
  8.         //b) 更新多条
  9.         mongoTemplate.updateMulti(query, update, User.class);
  10.         //c) 不存在就插入(存在就更新第一条)
  11.         mongoTemplate.upsert(query, update, User.class);
复制代码
指定某字段自增一,大概自减一.
  1.             mongoTemplate.updateFirst(
  2.                     Query.query(
  3.                             Criteria
  4.                                     .where("_id")
  5.                                     .is(dto.getTargetId())
  6.                     ),
  7.                     new Update().inc("like_cnt", 1), //如果是 -1,就表示自减一
  8.                     AlbumStatGO.class
  9.             );
复制代码
1.5.4、删除

  1.         //1.删除所有
  2.         mongoTemplate.remove(new Query(), User.class);
  3.         //2.条件删除
  4.         mongoTemplate.remove(Query.query(Criteria.where("name").is("林俊杰")), User.class);
复制代码

1.6、事务

MongoDB 4.0 之后就支持事务了.
但是开启事务的前提如下:
a)开启集群模式(多副本集设置)
b)进行如下设置:
  1. @Configuration
  2. class MongoTransaction {
  3.     @Bean
  4.     fun transactionManager(factory: MongoDatabaseFactory): MongoTransactionManager {
  5.         return MongoTransactionManager(factory)
  6.     }
  7. }
复制代码
c)在需要回滚的地方加上 @Transactional 注解 
  1.     @Transactional
  2.     fun handler(dto: RegDto) {
  3.         userIdentRepo.save(dto)
  4.         throw AppException(ApiStatus.INVALID_PARAM, "这里故意触发异常,为了检验事务*-")
  5.         userDetailRepo.save(dto.id!!)
  6.     }
复制代码
  Ps:如果没有进行副本集的设置,就会报如下错误:
  

  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表