当前位置:   article > 正文

MongoDB - 整合 SpringBoot 操作全流程_springboot mongodb

springboot mongodb

目录

一、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、删除


一、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)删除集合

        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. // query.addCriteria(Criteria.where("fieldName").is("value"));
  6. // 添加排序条件,如果有的话
  7. // query.with(Sort.by(Sort.Direction.ASC, "fieldName"));
  8. // 计算跳过的文档数量
  9. long skip = (page - 1) * size;
  10. // 设置查询的起始位置和返回的数量
  11. query.skip(skip).limit(size);
  12. // 执行查询并返回结果
  13. return mongoTemplate.find(query, MyDocument.class, "collectionName");
  14. }

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);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/628669
推荐阅读
相关标签
  

闽ICP备14008679号