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 遵循以下调用格式: // …...
SQL Server数据库标记为SUSPECT的紧急修复指南:从单用户到多用户模式的完整恢复流程
1. 数据库被标记为SUSPECT的常见原因 数据库突然变成SUSPECT状态,就像电脑突然蓝屏一样让人措手不及。我遇到过最典型的情况是机房突然断电,导致SQL Server没来得及完成所有事务就强制关闭了。这种情况下,数据库引擎为了保护数据完整性&#…...
Fun-ASR参数配置攻略:热词列表、目标语言,这样设置准确率最高
Fun-ASR参数配置攻略:热词列表、目标语言,这样设置准确率最高 1. 为什么参数配置如此重要? 语音识别系统的准确率往往取决于两个关键因素:模型本身的性能和使用者的参数配置。Fun-ASR作为钉钉与通义实验室联合推出的企业级语音识别…...
如何快速实现单图像3D重建:TripoSR完整实战指南
如何快速实现单图像3D重建:TripoSR完整实战指南 【免费下载链接】TripoSR 项目地址: https://gitcode.com/GitHub_Trending/tr/TripoSR 想要从一张普通图片快速生成逼真的3D模型吗?TripoSR正是你需要的终极解决方案!这个革命性的开源…...
Win11下用VMware16安装UOS服务器版全流程(附镜像+序列号)
Win11环境下VMware 16安装UOS服务器版实战指南 在数字化转型浪潮中,国产操作系统正逐步成为企业IT基础设施的新选择。统信UOS作为国内领先的服务器操作系统,凭借其稳定性与安全性,正在金融、政务等领域获得广泛应用。本文将手把手指导Windows…...
别再死记公式了!用Python的SymPy库5分钟搞定雅可比矩阵计算(附机器人学实例)
用SymPy解放双手:5分钟完成雅可比矩阵的符号计算与机器人学应用 记得研究生时期推导机械臂动力学方程,我曾在草稿纸上密密麻麻写满三页偏导数,最后发现一个正负号错误导致全部重算。直到遇见SymPy——这个Python符号计算库彻底改变了我的工作…...
导师推荐!2026年最值得用的专业AI论文写作工具
2026年AI论文写作工具已从“单点辅助”升级为智能化学术研究系统,核心评价维度涵盖文献真实性、格式合规性、长文本逻辑、查重降重、AIGC合规等关键指标。本次测评覆盖6款主流工具,测试场景包括中文与英文论文、全流程与专项功能、免费与付费版本&#x…...
大麦抢票神器:3分钟快速上手,轻松搞定热门演出门票
大麦抢票神器:3分钟快速上手,轻松搞定热门演出门票 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 你是一个文章写手&#x…...
5分钟搞定KEPserver V6配置:Java读取西门子PLC数据的保姆级教程
5分钟极速配置KEPserver V6与Java通信:西门子S7-1500数据采集实战指南 当工业现场的PLC数据需要与IT系统集成时,OPC技术栈往往是最直接的选择。但传统OPC配置过程繁琐的文档和复杂的依赖管理,常让工程师在项目初期耗费大量时间在环境搭建上。…...
如何借助内网穿透工具实现WinSCP跨系统远程文件管理的稳定连接
1. 为什么需要内网穿透实现WinSCP远程文件管理 作为开发者或运维人员,我经常需要在Windows和Linux服务器之间传输文件。最初我尝试用U盘或网盘中转,但效率太低;后来改用WinSCP直连局域网,又遇到跨地域办公的难题。直到发现内网穿透…...
图像处理中的NCC算法:从原理到优化(附Python实现对比)
图像处理中的NCC算法:从原理到优化(附Python实现对比) 在计算机视觉领域,模板匹配是一项基础而重要的技术。想象一下这样的场景:你正在开发一个工业质检系统,需要在流水线上快速识别产品上的特定标识&#…...
