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
这里我的安装命令是这样的:
#拉取镜像
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 基本概念
名词
对于不同数据库中的名词,我们还是有必要对比着来记忆:
SQL | MongoDB | 含义 |
---|---|---|
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 {@Idprivate String id;@Indexedprivate Long memberId;private String memberNickname;private String memberIcon;@Indexedprivate Long productId;private String productName;private String productPic;private String productSubTitle;private String productPrice;private Date createTime;
}
接着在功能接口的实现类中调用继承MongoRepository接口的MemberReadHistoryRepository接口中的抽象衍生查询方法以及相应的父类接口继承下来的方法实现用户浏览数据的读写操作。比如创建用户浏览数据的功能方法:
@Autowiredprivate MemberReadHistoryRepository memberReadHistoryRepository;@Overridepublic int create(MemberReadHistory memberReadHistory) {memberReadHistory.setId(null);memberReadHistory.setCreateTime(new Date());memberReadHistoryRepository.save(memberReadHistory);return 1;}
具体来说:创建浏览记录我们会调用MemberReadHistoryRepository下的save()将实体类对象直接存储到MongoDB中,批量删除调用的是deleteAll将包含要删除的用户浏览数据memberReadHistory对象从MongoDB中删除;而对于展示所有的用户浏览数据我们也在衍生查询中定义相关操作。
总结
在这篇文章中,荔枝主要梳理了MongoDB整合进mall脚手架的知识点,内容不多但还是要与前面的博客联系在一起看会比较好哈哈哈。接下来荔枝会继续将最后的两个中间件的场景和整合过程中梳理的知识进行总结。
今朝已然成为过去,明日依然向往未来!我是荔枝,在技术成长之路上与您相伴~~~
如果博文对您有帮助的话,可以给荔枝一键三连嘿,您的支持和鼓励是荔枝最大的动力!
如果博文内容有误,也欢迎各位大佬在下方评论区批评指正!!!
相关文章:

Mall脚手架总结(三) —— MongoDB存储浏览数据
前言 通过Elasticsearch整合章节的学习,我们了解SpringData框架以及相应的衍生查询的方式操作数据读写的语法。MongoDB的相关操作也同样是借助Spring Data框架,因此这篇文章的内容比较简单,重点还是弄清楚MongoDB的使用场景以及如何通过Sprin…...

Maven 引入外部依赖
如果我们需要引入第三方库文件到项目,该怎么操作呢? pom.xml 的 dependencies 列表列出了我们的项目需要构建的所有外部依赖项。 要添加依赖项,我们一般是先在 src 文件夹下添加 lib 文件夹,然后将你工程需要的 jar 文件复制到 …...

BS EN 12104-2023 软木地砖检测
软木地砖是指含有烧结成分的软木制成的块状砖,可用于地面覆盖物,装饰层等,具有脚感柔软舒适,防滑性能好,静音等性能,同时也其耐磨性较差,不易清洁。 BS EN 12104-2023软木地砖测试 测试项目 测…...

用Nginx搭建一个可用的静态资源Web服务器
sudo wget http://dlib.net/files/dlib-19.24.tar.bz2下载需要的文件。 sudo tar jxf dlib-19.24.tar.bz2进行解压。 sudo mkdir /nginx/dlib在nginx安装目录/nginx创建一个新的目录dlib。 配置文件nginx.conf里边的内容如下: worker_processes 1; events {…...

MAX30102心率血氧传感器
MAX30102心率血氧传感器介绍 背景基本功能基本结构基本原理采集方法直通式采集方法反射式采集方法 血氧采集原理Beer-Lambert 定理皮肤组织模型血氧测量过程AC / DC 的计算 心率采集原理 实验结果代码走读资源链接 背景 目前,基本上所有的可穿戴式设备都集成了心率…...

高效解决 TypeError : ‘ numpy._DTypeMeta‘ object is not subscriptable 问题
文章目录 问题描述解决问题 问题描述 解决问题 参考博文 打开报错位置 AppData\Roaming\Python\Python39\site-packages\cv2\typing\ 添加single-quotes,即单引号 博主说The trick is to use single-quotes to avoid the infamous TypeError: ‘numpy._DTypeMeta’…...

Hadoop作业篇(一)
一、选择题 1. 以下哪一项不属于Hadoop可以运行的模式__C____。 A. 单机(本地)模式 B. 伪分布式模式 C. 互联模式 D. 分布式模式 C. 互联模式 不属于Hadoop可以运行的模式。 Hadoop主要有四种运行模式: A. 单机(本地…...

SpringCloud中的分布式锁用法详解(Java+Redis SETNX命令)
前言: 在分布式系统中,保证数据的一致性和并发控制是至关重要的。分布式锁能够解决多个进程/线程同时访问共享资源的问题,确保只有一个进程/线程能够获得锁。本文将介绍如何使用Java和Redis实现分布式锁,并提供示例代码和注意事项…...

初学者如何选择:前端开发还是后端开发?
#开发做前端好还是后端好【话题征文】# 作为一名有多年开发经验的过来人,我认为前端开发和后端开发都有其独特的魅力和挑战。下面我将就我的个人经历和观点来分享一些关于前端开发和后端开发的看法。 首先,让我们将编程世界的大城市比作前端开发和后端开…...

从php页面插入MySQL的数据变为乱码如何解决?
在 PHP 页面中向 MySQL 数据库插入数据时,如果数据出现乱码,可能是因为字符集设置不正确或者字符编码不匹配。 数据库字符集设置不正确: 确保数据库的字符集设置与您的应用程序所使用的字符集一致。通常情况下,UTF-8 是一个通用的…...

OpenCV防抖实践及代码解析笔记
视频防抖是指用于减少摄像机运动对最终视频的影响的一系列方法。摄像机的运动可以是平移(比如沿着x、y、z方向上的运动)或旋转(偏航、俯仰、翻滚)。 正如你在上面的图片中看到的,在欧几里得运动模型中,图像…...

函数栈帧的创建与销毁剖析
目录 一、前言 二、基础知识介绍 2.1 寄存器介绍 2.2、汇编指令介绍 三、函数栈帧的创建销毁过程 3.1 调用main函数的函数 3.2 main函数开辟栈帧 3.3 在main函数中创建变量 3.4 调用Add函数前的准备 3.5 为Add函数开辟栈帧 3.6 在Add函数中创建变量并运算 3.7 Add函…...

性能测试-如何进行监控设计
监控设计步骤 首先,你要分析系统的架构。在知道架构中使用的组件之后,再针对每个组件进行监控。 其次,监控要有层次,要有步骤。先全局,后定向定量分析。 最后,通过分析全局、定向、分层的监控数据做分析…...

大数据List去重
概述 两个超大List集合去重,时间最短的方式去实现。 详细 MaxList模块主要是对Java集合大数据去重的相关介绍。 背景: 最近在项目中遇到了List集合中的数据要去重,大概一个2500万的数据,开始存储在List中,需要跟一个2万的List去…...

CentOS8.2重启网络
查看网络配置命令 # ip addr # nmcli ens160: 已连接 到 ens160"VMware VMXNET3"ethernet (vmxnet3), 00:50:56:B6:34:84, 硬件, mtu 1500ip4 默认inet4 10.3.10.111/24route4 10.3.10.0/24route4 0.0.0.0/0inet6 fe80::250:56ff:feb6:3484/64route6 ff00::/8rou…...

2023年【G1工业锅炉司炉】考试题及G1工业锅炉司炉模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 2023年G1工业锅炉司炉考试题为正在备考G1工业锅炉司炉操作证的学员准备的理论考试专题,每个月更新的G1工业锅炉司炉模拟考试祝您顺利通过G1工业锅炉司炉考试。 1、【多选题】TSGG0001-2012《锅炉安全技术监…...

观察者模式 行为型设计模式之七
1.定义 在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样定义的:定义对象的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化࿰…...

数据结构与算法之堆: Leetcode 451. 根据字符出现频率排序 (Typescript版)
根据字符出现频率排序 https://leetcode.cn/problems/sort-characters-by-frequency/ 描述 给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。返回 已排序的字符串 。如果有多个答案,返回其…...

吃透底层:从路由到前缀树
前言 今天学到关于路由相关文章,发现动态路由中有一个很常见的实现方式是前缀树,很感兴趣这个算法,故进行记录。 前缀树 Trie(又被叫做字典树)可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含…...

SparkSQL外部数据源
1.简介 1.1 多数据源支持 Spark 支持以下六个核心数据源,同时 Spark 社区还提供了多达上百种数据源的读取方式,能够满足绝大部分使用场景。 - CSV - JSON - Parquet - ORC - JDBC/ODBC connections - Plain-text files 1.2 读数据格式 所有读取 API 遵循以下调用格式: // …...

林沛满-TCP 是如何避免被发送方分片的?
TCP 可以避免被发送方分片,是因为它主动把数据分成小段再交给网络层。最大的分段大小称为 MSS(Maximum Segment Size),它相当于把 MTU 刨去 IP头和 TCP 头之后的大小,所以一个 MSS 恰好能装进一个 MTU 中。 图4 图 4 …...

Java中的枚举是什么?
Java枚举详解 枚举(Enum)是Java编程语言中的一种特殊数据类型,它用于表示一组具名的常量。枚举提供了一种更加类型安全和易于理解的方式来表示常量值,使代码更加清晰和可维护。 为什么需要枚举? 在介绍Java枚举的具…...

java学习--day24(单例模式序列化Lambda表达式)
文章目录 回顾今天的内容1.单例模式2.序列化3.Lambda表达式3.1入门案例3.2lambda表达式语法格式3.2.1无参无返回值的形式3.2.2有参无返返回值的方法3.2.3无参有返回值3.2.4有参有返回值的 回顾 1.三种创建Class对象的形式Class.forName("")类.class对象.getCalss()字…...

从0开始学go第六天
方法一:gin获取querystring参数 package main//querystring import ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/web", func(c *gin.Context) {//获取浏览器那边发请求携带的query String参数//…...

unity设计模式——代理模式
Subject类,定义了Real Subject和Proxy的共用接口,这样就在任何使用Real Subject的地方都可以使用Proxy。 abstract class Subject : MonoBehaviour {public abstract void Request(); } RealSubject类,定义Proxy所代表的真实实体。 class R…...

SpringBoot 如何使用 Grafana 进行可视化监控
使用Spring Boot Sleuth进行分布式跟踪 在现代分布式应用程序中,跟踪请求和了解应用程序的性能是至关重要的。Spring Boot Sleuth是一个分布式跟踪解决方案,它可以帮助您在分布式系统中跟踪请求并分析性能问题。本文将介绍如何在Spring Boot应用程序中使…...

【Codeforces】 CF1762E Tree Sum
题目链接 CF方向 Luogu方向 题目解法 首先考虑 n n n 为奇数的情况无解,这个可以通过乘积矛盾简单证明 接下来考虑一个结论是:偶数个点的树的形态确定之后,只有恰好 1 1 1 种染色方案,即从叶子一层一层往上面染,…...

用《斗破苍穹》的视角打开C#委托2 委托链 / 泛型委托 / GetInvocationList
委托链 经过不懈地努力,我终于成为了斗师,并成功掌握了两种斗技——八极崩和焰分噬浪尺。于是,我琢磨着,能不能搞一套连招,直接把对方带走。 using System; using System.Collections.Generic; using System.Linq; u…...

唐老师讲电赛
dc-dc电源布局要点...

[ICCV-23] DeformToon3D: Deformable Neural Radiance Fields for 3D Toonification
pdf | code 将3D人脸风格化问题拆分为几何风格化与纹理风格化。提出StyleField,学习以风格/ID为控制信号的几何形变残差,实现几何风格化。通过对超分网络引入AdaIN,实现纹理风格化。由于没有修改3D GAN空间,因此可以便捷实现Edit…...