• Mall脚手架总结(三) —— MongoDB存储浏览数据


    前言

            通过Elasticsearch整合章节的学习,我们了解SpringData框架以及相应的衍生查询的方式操作数据读写的语法。MongoDB的相关操作也同样是借助Spring Data框架,因此这篇文章的内容比较简单,重点还是弄清楚MongoDB的使用场景以及如何通过Spring Data来操作MongoDB。希望对正在学习的小伙伴有帮助~~~


    文章目录

    前言

    一、整合MongoDB实现文件存储 

    1.1 MongoDB的应用场景

    1.2 Window下Docker安装

    1.3 基本概念

    1.4 MongoRepository

    1.5 常用注解

    1.6 浏览历史记录的实现流程

    总结


    一、整合MongoDB实现文件存储 

            MongoDB是一个由C++语言编写的基于分布式文件存储的数据库,它是非关系数据库中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。总的来说,MongoDB是文档型的NoSQL数据库,数据以文档(对应关系型数据库的记录)的形式在MongoDB中保存,数据结构由Key-Value键值对组成。

    1.1 MongoDB的应用场景

            在传统的关系型数据库中,对于已经成倍增加的个人信息,社交网络,地理位置,操作日志等用户数据进行数据挖掘显得有点吃力,NoSQL数据库可以比较好的处理这些数据量大的数据。而MongoDB作为一种NoSQL数据库,相比于关系型数据库更能满足要求更高的数据存储需求,比如:High performance数据库高并发读写需求、Huge Storage海量数据的高效率存储和访问的需求、High Scalability && High Availability对数据库的高可扩展性和高可用性的需求。

    总结起来MongoDB适用的场景一般有如下的三个特点

    • 并发要求高且读写频繁
    • 数据量大
    • 数据价值较低,对事务要求不高

    一般用在存储用户浏览记录、日志记录、游戏中的用户数据、社交工具中的用户数据、第三方信息的抓取存储等。 

    1.2 Window下Docker安装

    安装mongodb的步骤可以参考下面的文章:

    https://developer.aliyun.com/article/999689

    这里我的安装命令是这样的:

    1. #拉取镜像
    2. docker pull mongo:4.2.5
    3. #启动容器并分配持久化数据卷
    4. docker run -p 27017:27017 --name mongo ^
    5. -v 你想要的持久化数据卷的数据保存地址^
    6. -d mongo:4.2.5 --auth
    7. #进入容器的命令
    8. docker exec -it mongo mongo

    1.3 基本概念

    名词 

    对于不同数据库中的名词,我们还是有必要对比着来记忆:

    SQLMongoDB含义

    database

    database

    数据库

    table

    collection

    数据库表 | 集合

    row

    document

    数据记录行 | 文档

    column

    field

    数据字段 | 域

    index

    index

    索引

    primary key

    primary key

    主键,MongoDB自动将_id字段设置为主键

    基本命令

    1. //使用数据库
    2. use test
    3. //插入数据
    4. db.article.insert({name:"MongoDB"})
    5. //删除数据库
    6. db.dropDatabase()
    7. //查看所有的数据库
    8. show dbs
    9. //集合命令
    10. db.createCollection("lzddl")
    11. show collections
    12. db.article.drop()
    13. //文档命令:
    14. //插入:db.集合对象.insert(文档对象)
    15. db.collection.insert(document)
    16. //获取所有文档:db.集合对象.find({})
    17. db.collection.find({})
    18. //查询指定文档
    19. db.collection.find(query, projection)
    20. /*
    21. *更新文档
    22. */
    23. db.collection.update(
    24. ,
    25. ,
    26. {
    27. multi: <boolean>
    28. }
    29. )
    30. // query:修改的查询条件,类似于SQL中的WHERE部分
    31. // update:更新属性的操作符,类似与SQL中的SET部分
    32. // multi:设置为true时会更新所有符合条件的文档,默认为false只更新找到的第一条
    33. db.collection.save(document)
    34. //删除
    35. db.collection.remove({'title':'MongoDB'})

    1.4 MongoRepository接口

            在脚手架的场景中,我们使用MongoDB来实现会员商品浏览历史记录的存储。与前面的Elasticsearch的使用相同,我们还是借助Spring Data框架来操作相应的数据读写操作。在上一篇文章中荔枝也对Spring Data提供的Repository接口及其子接口的关系及其各自的功能做了梳理,可以在荔枝的项目学习专栏中找到: 项目学习_荔枝当大佬的博客-CSDN博客

            跟ES中提供的接口ElasticsearchRepository类似,Spring Data也提供了一个MongoRepository接口,通过继承该接口并在其中定义抽象的衍生查询方法,我们就可以实现Spring操作MongoDB数据库的读写数据操作。还是老规矩我们来看看接口的继承关系:

            这里我们了解一下新出现的QueryByExampleExecutor接口,该接口是一个查询接口,我们可以通过使用实体类的示例对象来构建查询条件,并且只提供需要用于查询的非空字段,而其他字段会被忽略。我们使用该接口中的方法时仅需要一个Example对象,这个Example类型的对象包含传进来的实体类probe、匹配规则matcher。

    这里有一篇写的不错的源码剖析:https://blog.csdn.net/listeningsea/article/details/122378964 有兴趣的话可以看看~~~

    使用的方法包括继承接口都是类似的,我们可以通过衍生查询来定义一个按照时间倒序获取用户浏览记录方法:

    1. public interface MemberReadHistoryRepository extends MongoRepository {
    2. /**
    3. * 根据会员id按时间倒序获取浏览记录
    4. * @param memberId 会员id
    5. */
    6. List findByMemberIdOrderByCreateTimeDesc(Long memberId);
    7. }

    通过Spring Data框架的整合,我们确实在操作不同的中间件的数据读写的时候变得更加的简单了!

    1.5 常用注解

    名称作用

    @Document

    标示映射到MongoDB文档上的领域对象

    @Id

    标示某个字段为ID域

    @Indexed

    标示某个字段为MongoDB的索引字段

    @Field

    配置MongoDB持久化保存文档时要使用的字段的名称

    @CompoundIndex

    复合索引,加复合索引后通过复合索引字段查询将大大提高速度。

    @GeoSpatialIndexed

    地理位置索引

    @TextIndexed

    全文索引

    1.6 浏览历史记录的实现流程

    首先我们需要定义好一个实体类存放用户的浏览记录的历史信息。 

    1. /**
    2. * @auther lzddl
    3. * @description 用户商品浏览历史记录
    4. */
    5. @Data
    6. @EqualsAndHashCode
    7. @Document
    8. public class MemberReadHistory {
    9. @Id
    10. private String id;
    11. @Indexed
    12. private Long memberId;
    13. private String memberNickname;
    14. private String memberIcon;
    15. @Indexed
    16. private Long productId;
    17. private String productName;
    18. private String productPic;
    19. private String productSubTitle;
    20. private String productPrice;
    21. private Date createTime;
    22. }

            接着在功能接口的实现类中调用继承MongoRepository接口的MemberReadHistoryRepository接口中的抽象衍生查询方法以及相应的父类接口继承下来的方法实现用户浏览数据的读写操作。比如创建用户浏览数据的功能方法:

    1. @Autowired
    2. private MemberReadHistoryRepository memberReadHistoryRepository;
    3. @Override
    4. public int create(MemberReadHistory memberReadHistory) {
    5. memberReadHistory.setId(null);
    6. memberReadHistory.setCreateTime(new Date());
    7. memberReadHistoryRepository.save(memberReadHistory);
    8. return 1;
    9. }

    具体来说:创建浏览记录我们会调用MemberReadHistoryRepository下的save()将实体类对象直接存储到MongoDB中,批量删除调用的是deleteAll将包含要删除的用户浏览数据memberReadHistory对象从MongoDB中删除;而对于展示所有的用户浏览数据我们也在衍生查询中定义相关操作。


    总结

            在这篇文章中,荔枝主要梳理了MongoDB整合进mall脚手架的知识点,内容不多但还是要与前面的博客联系在一起看会比较好哈哈哈。接下来荔枝会继续将最后的两个中间件的场景和整合过程中梳理的知识进行总结。

    今朝已然成为过去,明日依然向往未来!我是荔枝,在技术成长之路上与您相伴~~~

    如果博文对您有帮助的话,可以给荔枝一键三连嘿,您的支持和鼓励是荔枝最大的动力!

    如果博文内容有误,也欢迎各位大佬在下方评论区批评指正!!!

  • 相关阅读:
    Linux中shell脚本练习
    面试:插件化相关---资源
    离线强化学习论文学习 Critic Regularized Regression
    2022-08-15 - 初识MySQL
    react-router-dom 实用技巧及3种传参方式
    if ...if...if...else...else...else...的使用
    云计算,用价格让利换创新空间?
    飞桨模型部署至docker并使用FastAPI调用(一)-docker安装与vscode连接
    tf.sparse
    一文看懂逻辑回归(保姆级别 && 含源码)
  • 原文地址:https://blog.csdn.net/qq_62706049/article/details/133750334