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

news2024/10/5 14:27:50

前言

        通过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

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

#拉取镜像
docker pull mongo:4.2.5

#启动容器并分配持久化数据卷
docker run -p 27017:27017 --name mongo ^
-v 你想要的持久化数据卷的数据保存地址^
-d mongo:4.2.5 --auth

#进入容器的命令
docker exec -it mongo mongo

1.3 基本概念

名词 

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

SQLMongoDB含义

database

database

数据库

table

collection

数据库表 | 集合

row

document

数据记录行 | 文档

column

field

数据字段 | 域

index

index

索引

primary key

primary key

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

基本命令

//使用数据库
use test
//插入数据 
db.article.insert({name:"MongoDB"})
//删除数据库
db.dropDatabase()
//查看所有的数据库
show dbs

//集合命令
db.createCollection("lzddl")
show collections
db.article.drop()

//文档命令:
//插入:db.集合对象.insert(文档对象)
db.collection.insert(document)
//获取所有文档:db.集合对象.find({})
db.collection.find({})
//查询指定文档
db.collection.find(query, projection)
/*
*更新文档
*/
db.collection.update(
   <query>,
   <update>,
   {
     multi: <boolean>
   }
)
// query:修改的查询条件,类似于SQL中的WHERE部分
// update:更新属性的操作符,类似与SQL中的SET部分
// multi:设置为true时会更新所有符合条件的文档,默认为false只更新找到的第一条

db.collection.save(document)

//删除
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 有兴趣的话可以看看~~~

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

public interface MemberReadHistoryRepository extends MongoRepository<MemberReadHistory,String> {
    /**
     * 根据会员id按时间倒序获取浏览记录
     * @param memberId 会员id
     */
    List<MemberReadHistory> findByMemberIdOrderByCreateTimeDesc(Long memberId);
}

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

1.5 常用注解

名称作用

@Document

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

@Id

标示某个字段为ID域

@Indexed

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

@Field

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

@CompoundIndex

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

@GeoSpatialIndexed

地理位置索引

@TextIndexed

全文索引

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

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

/**
 * @auther lzddl
 * @description 用户商品浏览历史记录
 */
@Data
@EqualsAndHashCode
@Document
public class MemberReadHistory {
    @Id
    private String id;
    @Indexed
    private Long memberId;
    private String memberNickname;
    private String memberIcon;
    @Indexed
    private Long productId;
    private String productName;
    private String productPic;
    private String productSubTitle;
    private String productPrice;
    private Date createTime;
}

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

@Autowired
    private MemberReadHistoryRepository memberReadHistoryRepository;
    @Override
    public int create(MemberReadHistory memberReadHistory) {
        memberReadHistory.setId(null);
        memberReadHistory.setCreateTime(new Date());
        memberReadHistoryRepository.save(memberReadHistory);
        return 1;
    }

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


总结

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1077494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode862 和至少为k的最短子数组

题目&#xff1a; 解析&#xff1a; 1、先构造前缀和数组 2、单调队列存放滑动窗口&#xff0c;目的求Sj-Si >k的情况下&#xff0c;窗口最小。 代码&#xff1a; class Solution {public int shortestSubarray(int[] nums, int k) {int n nums.length;long[] sums new …

网工内推 | base郑州,上市公司,最高15薪,五险一金全额缴

01 四方达 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责公司数据中心&#xff08;机房&#xff09;的管理与运维工作。 2、负责公司服务器、路由器、防火墙、交换机等设备的管理、以及网络平台的运行监控和维护&#xff1b; 3、负责公司服务器运维管理工作、…

Git相关知识(1)

目录 1.初识Git 1.基础知识 2.centos中下载 2.基本操作 1.创建本地仓库 2.配置本地仓库 3.版本库、工作区、暂存区 4.添加文件 5.add和commit对git文件的作用 6.修改文件 7.版本回退 8.撤销修改 9.删除文件 3.分支操作 1.HEAD与分支 2.创建分支 3.删除分支 …

python中TagMe包的token获取

草&#xff0c;找了40分钟&#xff01;帮助大家少浪费时间。 1.注册Tagme&#xff0c;注册地址https://services.d4science.org/home &#xff08;我用邮箱注册一直说验证码不对&#xff0c;最后用Google账号注册的&#xff09; 2.找sobigdata 3.进入sobigdata后&#xff0c;…

17基于matlab卡尔曼滤波的行人跟踪算法,并给出算法估计误差结果,判断算法的跟踪精确性,程序已调通,可直接运行,基于MATLAB平台,可直接拍下。

17基于matlab卡尔曼滤波的行人跟踪算法&#xff0c;并给出算法估计误差结果&#xff0c;判断算法的跟踪精确性&#xff0c;程序已调通&#xff0c;可直接运行&#xff0c;基于MATLAB平台&#xff0c;可直接拍下。 17matlab卡尔曼滤波行人跟踪 (xiaohongshu.com)

MySQL总结练习题

目录 1.准备数据表 2.表之间的关系 3.题目 3.1 取得每个部门最高薪水的人员名称 3.2 哪些人的薪水在部门的平均薪水之上 3.3 取得部门中&#xff08;所有人的&#xff09;平均的薪水等级 3.4 不准用组函数&#xff08;Max &#xff09;&#xff0c;取得最高薪水 3.5 取…

Java基础之反射机制

背景&#xff1a;Java程序中的所有对一项都有两种类型&#xff1a;编译时类型和运行时类型&#xff08;由于多态导致的&#xff09;&#xff0c;这可能会导致对象的编译时类型和运行时类型不一致。 反射&#xff08;Reflection&#xff09;是被是为动态语言的关键&#xff0c;反…

速通Redis基础(二):掌握Redis的哈希类型和命令

目录 Redis 哈希类型简介 Redis 哈希命令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET HLEN HSETNX ​编辑 HINCRBY HINCRBYFLOAT Redis的哈希类型命令小结 Redis 是一种高性能的键值存储数据库&#xff0c;支持多种数据类型&#xff0c;其中之…

jdbc+数据连接池

1.1 JDBC概念 JDBC 就是使用Java连接并操作数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 1.2 JDBC优势 可随时替换底层数据库&#xff0c;访问数据库的Java代码基本不变 以后编写操作数据库的代码只需要面向JDBC&#xff08;接口&…

如何在Windows系统搭建VisualSVN服务并在公网远程访问【内网穿透】

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

尚品甄选2023全新SpringBoot+SpringCloud企业级微服务项目

最适合新手入门的SpringBootSpringCloud企业级微服务项目来啦&#xff01;如果你已经学习了Java基础、SSM框架、SpringBoot、SpringCloud&#xff0c;想找一个项目来实战练习&#xff1b;或者你刚刚入行&#xff0c;需要可以写到简历中的微服务架构项目&#xff01; 项目采用前…

大运新能源天津车展深度诠释品牌魅力 为都市人群打造理想车型

如今&#xff0c;新能源汽车行业发展潜力巨大&#xff0c;不断吸引无数车企入驻新能源汽车赛道&#xff0c;而赛道的持续紧缩也让一部分车企很难找到突破重围的机会。秉持几十年的造车经验&#xff0c;大运新能源凭借雄厚的品牌实力从一众车企中脱颖而出。从摩托车到重卡&#…

在两个有序数组中找整体第k小的数

一、题目 给定两个已经排序的数组&#xff08;假设按照升序排列&#xff09;&#xff0c;然后找出第K小的数。比如数组A {1&#xff0c; 8&#xff0c; 10&#xff0c; 20}&#xff0c; B {5&#xff0c; 9&#xff0c; 22&#xff0c; 110}&#xff0c; 第 3 小的数是 8.。…

基于 Mtcnn(人脸检测)+Hopenet(姿态检测)+拉普拉斯算子(模糊度检测) 的人脸检测服务

写在前面 工作原因&#xff0c;顺便整理博文内容为一个 人脸检测服务分享以打包 Docker 镜像&#xff0c;可以直接使用服务目前支持 http 方式该检测器主要适用低质量人脸图片处理理解不足小伙伴帮忙指正&#xff0c;多交流&#xff0c;相互学习 对每个人而言&#xff0c;真正的…

11.动名词

一.什么是动名词 动名词是动词的另一种非谓语动词形式。动名词跟宾语或状语构成动名词短语&#xff0c;动名词跟动词不定式一样&#xff0c;都属于非谓语动词&#xff0c;不能作谓语&#xff0c;动名词或动名词短语可以作主语&#xff0c;表语&#xff0c;宾语&#xff0c;介词…

fastjson2与fury的巅峰对决,谁会笑到最后?

写在前面 两个月前&#xff0c;我们写过一篇关于fury和protostuff的性能对比的文章&#xff1a;谁才是真正的协议之王&#xff1f;fastjson2 vs fury&#xff0c;那时&#xff0c;两个协议框架各有千秋&#xff0c;不分伯仲&#xff0c;今天&#xff0c;看到fury推出了全新的0…

我用Python写了几个摸鱼小游戏,赐你2023年度上班上学摸鱼必备良品!(附源码)

文章目录 前言一丶超级玛丽二、沙漠打地鼠三、贪吃蛇四、坦克大战五、五子棋 前言 获取python整套完整教程&#xff0c;3263学习笔记&#xff0c;源码&#xff0c;项目实战&#xff0c;全部在手&#xff0c;python不愁~~~ Python学习资料点击领取福利 例如&#xff1a; 超级…

js高级(2)函数的柯里化,cookie的使用,10天免登录案例,购物车案例,拖动盒子小案例等等

1.函数的柯里化 自定义函数的柯里化 // 自定义函数的柯里化function curry(fn) {//判断输入的函数有几个参数let len fn.length;// 返回一个函数,并且有函数名为treturn function t() {// 获取到实参的个数let innerLength arguments.length// 获取到真实参数,转化为数组[.…

FPGA---UDP通信求助

项目场景&#xff1a; 使用UDP进行回环&#xff0c;网络调试助手&#xff0c;发送数据通过UDP接收模块接收&#xff0c;解析出数据&#xff0c;给到UDP发送模块&#xff0c;传回上位机。 问题描述 UDP接收模块中&#xff0c;接收到的CRC校验值与自己计算CRC校验值进行判断&am…

【电商API接口的应用:电商数据分析入门】初识Web API(一)

如何使用Web应用变成接口(API)自动请求网站到特定信息而不是整个网站&#xff0c;再对这些信息进行可视化。由于这样编写到程序始终使用最新到数据来生成可视化&#xff0c;因此即便数据瞬息万变&#xff0c;它呈现到信息也都是最新的。 使用Web API Web API是网站的一部分&am…