• SpringData MongoDB学习总结


    目录

    一、简介

    二、搭建

    三、操作

    (1)、集合操作

    (2)、文档操作

    相关注解

    POJO

    添加文档

    查询文档

    更新文档

    删除文档

    聚合操作


    一、简介

    NoSql数据库

    1. 键值对key-value 存储
    2. redis
    3. 用户缓存,用户信息回话,配置信息,购物车
    4. 文档存储
    5. 数据结构不严格,表结构可变
    6. 类json
    7. MongoDB
    8. 列族存储
    9. 图形存储

    优势:

    基于灵活的json文档模型,非常适合敏捷方式的快速开发,临时增加字段影响很小

    其实与生俱来的高可用,高水平扩展能力

    应用场景

    1. 游戏场景
    2. 用户的装备信息,积分等
    3. 物流场景
    4. 订单信息-状态
    5. 社交场景
    6. 用户信息,地理位置索引,附件的人,地点等信息
    7. 视频直播
    8. 用户数据,礼物信息等
    9. 大数据应用
    10. 云存储系统

    二、搭建

    docker安装mongoDB

    1. docker pull mongo
    2. 1、创建mongo数据持久化目录
    3.   mkdir -p /docker_volume/mongodb/data
    4. 运行容器
    5. docker run -itd --name mongo -v /docker_volume/mongodb/data:/data/db -p 27017:27017 mongo
    6. 进入容器
    7. docker exec -it mongo /bin/mongosh
    8. // 创建用户
    9. use admin
    10. db.createUser(
    11. {
    12. user: "root",
    13. pwd: "123456",
    14. roles: [ { role: "root", db: "admin" } ]
    15. }
    16. )

    三、操作

    配置文件

    1. spring:
    2. data:
    3. mongodb:
    4. host: ip地址 #ip
    5. port: 27017 #端口号
    6. username: root #用户
    7. password: 123456 #密码
    8. database: admin #数据库名字--集合名字

    数据库结构:

    数据库(admin,test)--集合--文档

    (1)、集合操作

    相当于mysql中的数据库

    1. // 判断是否有这个集合
    2. boolean has =mongoTemplate.collectionExists("emp");
    3. // 删除集合
    4. mongoTemplate.dropCollection("emp");
    5. // 创建集合
    6. mongoTemplate.createCollection("emp");

    例如:

    1. @Autowired
    2. MongoTemplate mongoTemplate;
    3. @Test
    4. void test1(){
    5. // 判断是否有这个集合
    6. boolean has = mongoTemplate.collectionExists("emp");
    7. if(has){
    8. // 删除集合
    9. mongoTemplate.dropCollection("emp");
    10. }
    11. // 创建集合
    12. mongoTemplate.createCollection("emp");}

    (2)、文档操作

    相当于mysql中的表操作

    数据操作

    相关注解

    1. @Document
    2. 作用在类上,表示当前文档
    3. @Document(文档名称,集合名称)
    4. @Id
    5. 作用在字段上
    6. 映射id字段
    7. @Field
    8. 作用在字段上
    9. 映射字段
    10. @Transient
    11. 该字段不会保存到数据库中

    POJO

    1. @AllArgsConstructor
    2. @NoArgsConstructor
    3. @Document("emp")
    4. @Data
    5. public class Employee {
    6. @Id
    7. private Integer id;
    8. @Field
    9. private String name;
    10. @Field
    11. private int age;
    12. @Field
    13. private Double salary;
    14. @Field
    15. private Date birthday;
    16. }

    添加文档

    1. 1、单条数据
    2. Employee zs= new Employee(1,"张三",21,500.00,new Date());
    3. // 添加文档 id存在时候更新数据--用于添加或者修改mongoTemplate.save(zs);
    4. mongoTemplate.save(zs); // 用于添加或者修改,支持批量插入
    5. // 如果 id存在会报错
    6. mongoTemplate.insert(zs); // 用于添加
    7. 2、批量添加
    8. @Test
    9. void insert(){
    10. List<Employee>list= Arrays.asList(
    11. new Employee(21,"往往",21,500.00,new Date()),
    12. new Employee(31,"小王",21,500.00,new Date()),
    13. new Employee(41,"小张",21,500.00,new Date()),
    14. new Employee(51,"肖红梅",21,500.00,new Date())
    15. );
    16. // 批量插入,如果id存在,会抛出异常--用于添加
    17. mongoTemplate.insert(list, Employee.class);
    18. }

    查询文档

    1. 1、查询全部
    2. List<Employee> all = mongoTemplate.findAll(Employee.class);
    3. 2、根据id查询
    4. Employee empTem = mongoTemplate.findById(1, Employee.class);
    5. 3、查询一条
    6. Employee one = mongoTemplate.findOne(new Query(), Employee.class);log.info("one:{}",one);
    7. 4、条件查询
    8. @Test
    9. public void tes3(){
    10. // 查询 id>=20 且 id<= 的字段
    11. List<Employee> list = mongoTemplate.find(Query.query(Criteria.where("id").gte(20).lte(60)), Employee.class);
    12. log.info("id>20的数据:{}",list);
    13. }
    14. 5、模糊查询/正则查询
    15. 正则不需要有 / /
    16. List<Employee> list = mongoTemplate.find(Query.query(Criteria.where("name").regex("张")), Employee.class);
    17. 6、多条件查询
    18. @Test
    19. public void tes5(){
    20. Criteria criteria=new Criteria();
    21. // criteria.orOperator()
    22. // 条件查询 name 为张三 id 为2
    23. criteria.andOperator(Criteria.where("name").is("张三"),Criteria.where("id").is(2));
    24. List<Employee> list = mongoTemplate.find(Query.query(criteria), Employee.class);
    25. log.info("的数据:{}",list);
    26. }
    27. 7、排序
    28. //asc 升序,decs降序
    29. List<Employee> list = mongoTemplate.find(new Query().with(Sort.by(Sort.Order.desc("id"))), Employee.class);
    30. 8、分页
    31. 使用skip和limt配合
    32. p = (pageNumber - 1) * pageSize
    33. q = pageSize
    34. skip(p) // 跳过p条数据
    35. limt(q) // list最大保留q条数据
    36. 例如:
    37. // 分页查询
    38. @Test
    39. public void tes7(){
    40. int pageName=3;
    41. int pageSize=4;
    42. int p=(pageName-1)*pageSize;
    43. int q=pageSize;
    44. List<Employee> list = mongoTemplate.find(new Query().skip(p).limit(q), Employee.class);
    45. log.info("第三页数据:{}",list);
    46. }
    47. 8、json字符串查询
    48. @Test
    49. public void tes8(){
    50. String json="{name:'张三'}";
    51. Query query=new BasicQuery(json);
    52. List<Employee> list = mongoTemplate.find(query, Employee.class);
    53. log.info("json串查询:{}",list);
    54. }

    更新文档

    数据修改

    1. 1、更新一条
    2. // 把id=1的 的行中 name改成小帅,更新查询到的第一条
    3. mongoTemplate.updateFirst(Query.query(Criteria.where("id").is(1)), Update.update("name","小帅"), Employee.class);
    4. 2、更新--没有找到目标就进行添加操作
    5. mongoTemplate.upsert(Query.query(Criteria.where("id").is(202)), Update.update("name", "小帅").set("salary",100), Employee.class);
    6. 或者
    7. mongoTemplate.save(new Employee(202,"往往",21,500.00,new Date(),"新字段"));
    8. 3、批量更新
    9. public void testUpdate2(){
    10. // 批量更新
    11. UpdateResult result = mongoTemplate.updateMulti(Query.query(Criteria.where("name").is("张三")), Update.update("name", "小红"), Employee.class);
    12. log.info("生效条数:{}",result.getModifiedCount());
    13. }
    14. UpdateResult 对象
    15. getMatchedCount() 返回满足查询条件的文档数。
    16. getModifiedCount() 返回实际更新的文档数。
    17. wasAcknowledged() 返回更新操作是否被服务器确认。

    删除文档

    删除数据

    1. 1、 删除所有文档
    2. mongoTemplate.remove(new Query(), Employee.class);
    3. 2、删除指定的
    4. mongoTemplate.remove(Query.query(Criteria.where("id").is(1)), Employee.class);

    聚合操作

    处理数据的计算结果(诸如统计平均值,求和等)

    聚合管道

    类似stream流

    可以用mongoTemplate.find().stream() 代替

    1. match(Criteria criteria)
    2. :根据指定的查询条件筛选文档。可以使用Criteria对象来定义查询条件。
    3. project(String... fieldNames)
    4. :选择要包含在结果中的字段。可以指定字段名或使用表达式进行投影操作。
    5. group(String... fieldNames)
    6. :按照指定的字段对文档进行分组。可以使用表达式或函数来定义分组操作。
    7. sort(Sort sort)
    8. :对结果进行排序。可以根据指定的字段进行升序或降序排序。
    9. skip(long num)
    10. :跳过指定数量的文档。
    11. limit(long num)
    12. :限制结果集的大小。
    13. unwind(String fieldName)
    14. :将一个数组字段展开为多个文档,并保持其他字段的一致性。
    15. lookup(String from, String localField, String foreignField, String as)
    16. :执行左连接操作,将当前集合与指定的外部集合进行关联。
    17. replaceRoot(String fieldName)
    18. :将指定字段的值作为新文档的根级别。
    19. count()
    20. :计算匹配文档的数量。

  • 相关阅读:
    Ubuntu设置允许root用户登录
    并联谐振DCDC变换器的设计与仿真
    OpenCV图像处理学习五,图像的线性混合叠加
    【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(三十一)
    【周赛复盘】力扣第 85 场双周赛
    【Verilog】除2,正负数
    Linux 基本指令(下)
    【Java】21天学习挑战赛
    Python内置函数系统学习(2)——数据转换与计算 (详细语法参考+参数说明+应用场景示例), max()在列表、元组、字典中的综合应用 | 编程实现当前内存使用情况的监控
    Git暂存区的意义或git add的意义
  • 原文地址:https://blog.csdn.net/weixin_72388638/article/details/133844005