企业架构NOSQL数据库之MongoDB

news2024/11/15 6:58:09

目录

一、背景描述及其方案设计

(一)业务背景描述

(二)模拟运维设计方案

二、Mongodb介绍

(一)nosql介绍

(二)产品特点

1、存储性

2、 效率性

3、结构

 三、安装和配置

(一)安装方式介绍

(二)二进制可执行安装

1、上传安装包到服务器目录

2、 解压到安装目录 并移动

 3、创建数据存储目录和日志目录

4、启动mongod服务

 (三)命令行客户端操作

 四、数据结构类型操作 CURD

(一)添加数据

1、mongodb里存储数据的格式文档形式,以bson格式的文档形式。

2、 语法:db.集合名称.insert(bson格式数据)

3、普通数据添加

4、多维数据对象添加

 5、数组信息添加

 (二)查询数据

1、语法:

2、笼统方式查询

 3、条件限制查询

 4、范围条件查询

5、多个条件查询

6、多维字段查询

7、数组条件查询

(1)查询满足其中之一即可显示

 (2)满足查询条件所有的才可显示

8、限制查询字段

 9、$or查询

10、count 语法

 11、limit语法 skip语法

 (三)修改数据

 1、语法:

2、有$set的修改

3、 没有$set的修改

 (四)删除数据

1、删除记录

2、删除字段

 五、安全设置

(一)限制登录

1、使用另外一台虚拟机,使用mongo命令行端进行测试

​编辑 2、关闭mongodb

3、 添加启动的脚本,启动mongod

 4、使用远程登录mongod服务

(二) 用户权限管理

1、需求

2、语法:

3、实现步骤:

①切换admin库,进行用户创建

②关闭mongod服务,重启添加权限参数并启动

​编辑 ③测试使用

​编辑 六、业务实例

 (一)PHP扩展安装

1、上传php扩展包

2、解压编译安装

3、添加php.ini匹配

4、重启php-fpm查看phpinfo

 (二)桌面管理使用

 1、软件是绿色版本,直接解压,点击使用即可

2、填写相关参数

 ​编辑

 3、测试是否可以正常连接

4、点击连接

 5、查看数据

 (三)日志统计展示

1、很多网站需要统计某个页面或者某个功能访问量,如果访问量比较大,需要记录的组件具有很快的读写效率。可以使用功能性更多的mongodb来完成此业务。mongodb具有更多的数据灵活性。

2、网站访问日志记录的信息:

3、使用服务器

4、Tip:nginx负载均衡服务器解决后端服务获取不到真实用户IP的方式

①在负载均衡nginx服务器,填写真实用户IP的转发

②web服务器的nginx需要配置接收真实的用户IP,需要使用到模块--with-http_realip_module,在编译安装nginx时需要加入

③配置语法

​编辑 ④操作实现步骤:

 (1)删除原来的文件

(2)上传修改好的文件

(3)访问页面之后,可以查看到访问已经被记录


一、背景描述及其方案设计

(一)业务背景描述

⽤户数量: 10000-12000(⽤户量猛增)
PV : 1000000-5000000(24小时访问次数总和)
QPS: 50-100*(每秒访问次数)  300
DAU: 2000~*000(每日活跃用户数)

根据业务需求:

用户访问日志是在web服务器access.log存储

统计每日访问量,峰值访问量

把每次访问存储到mongodb中,mongodb用来筛选日志

(二)模拟运维设计方案

根据以上业务需求,采用mongodb数据库存储用户的访问日志,使用单台服务器

①访问日志存储

②在mongo中筛选查看信息

二、Mongodb介绍

(一)nosql介绍

数据库排名:https://db-engines.com/en/ranking

关系数据库 RDBMS   设计表结构,通过SQL语句进行操作。连表关系

常见的关系型数据库:mysql oracle(商业) DB2(IBM) sqlserver(微软) access(微软) sqlite3(小型 嵌入到APP中) postgresql(加州伯克利大学)

nosql 泛指非关系数据库 存储格式key=>value   

memcached   redis 内存缓存数据库  

mongodb  具有更多的功能,可以适用于大部分的mysql场景 document store  文档型数据库

(二)产品特点

1、存储性

比较适合存储大量的没有规则无序的数据。

存储量大:单表实现存储PB级别的数据

1KB = 1024B

1MB = 1024KB

1GB = 1024MB

1TB = 1024GB

1PB = 1024TB

1EB (Exabyte 百亿亿字节 艾字节)=1024PB,

1ZB (Zettabyte 十万亿亿字节 泽字节)= 1024EB,

1YB (Yottabyte 一亿亿亿字节 尧字节)= 1024ZB,

2、 效率性

数据的效率,就是指存储和读写速度。

 

3、结构

 三、安装和配置

(一)安装方式介绍

yum方式安装:Install MongoDB Community Edition on Red Hat or CentOS — MongoDB Manual

手动通用安装:Install MongoDB Community Edition on Linux — MongoDB Manual

(二)二进制可执行安装

1、上传安装包到服务器目录

2、 解压到安装目录 并移动

shell > tar xvf mongodb-linux-x86_64-rhel62-3.6.5.tgz
shell > mv mongodb-linux-x86_64-rhel62-3.6.5 /usr/local/mongodb

 3、创建数据存储目录和日志目录

shell > cd /usr/local/mongodb

shell > mkdir data

shell > mkdir logs

4、启动mongod服务

shell > cd /usr/local/mongodb/bin

shell > ./mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs/log.txt --fork

参数介绍:

dbpath 数据存储路径

logpath 日志存储路径

fork  后台启动

auth  权限开启

bind_ip  指定绑定网卡ip

 (三)命令行客户端操作

 四、数据结构类型操作 CURD

(一)添加数据

1、mongodb里存储数据的格式文档形式,以bson格式的文档形式。

在mongodb中,可有无需创建数据库和集合,使用的时候会自动创建 

创建一个库devops

2、 语法:db.集合名称.insert(bson格式数据)

3、普通数据添加

db.goods.insert({name:'huawei01',price:1000,weight:135,number:35})

4、多维数据对象添加

db.goods.insert({name:'xiaomi5',price:1999,weight:156,number:45,area:{province:'beijing',city:'beijing'}})

 5、数组信息添加

db.goods.insert({name:'xiaomimax',price:2000,weight:180,number:100,area:{province:'henan',city:'zhengzhou'},color:['black','white','red']})

 (二)查询数据

1、语法:

db.集合名称.find(查询条件)

db.集合名称.findOne(查询条件)

2、笼统方式查询

不进行条件限制,全部取出来。

findOne会取出符合结果的第一条信息,并且以格式化形式返回

 3、条件限制查询

条件格式,所见及所得
db.goods.find({name:'xiaomimax'})
db.goods.findOne({name:'xiaomimax'})

 4、范围条件查询

mysql   <     <=   >   >=    !=

mongo  $lt    $lte  $gt  $gte  $ne

db.goods.find({price:{'$lte':1999}})

db.goods.find({price:{'$lt':1999}})

5、多个条件查询

类似mysql中的AND语法

db.goods.find({price:{'$lte':1999},number:{'$gte':40}})

6、多维字段查询

通过多维字段的值进行查询

db.goods.find({'area.city':'zhengzhou'});

注意:多维字段需要用引号包含起来

7、数组条件查询

(1)查询满足其中之一即可显示

db.goods.find({color:'black'})

 (2)满足查询条件所有的才可显示

db.集合名称.find({字段(数组):{‘$all’:[v1,v2]}})

db.goods.insert({name:'iphonex',price:8398,weight:100,number:200,area:{province:'jiangsu',city:'nanjing'},color:['gray','black','white','gold']})

db.goods.find({color:{'$all':['black','gold']}})

8、限制查询字段

在实际使用环境,不需要查询并显示太多的字段。可以选择设定显示。

语法:db.集合名称.find({查询条件},{筛选条件})

显示为1,不显示为0   要是1都是1,要是0都是0  _id除外

db.goods.find({color:{'$all':['black','gold']}},{name:1,_id:0})

 注意采用合适的方式,显示出查询字段值内容

_id是mongodb数据库里的集合中,默认的主键id,具有索引内容,通过主键查询,会很快的查询速度。不要随意修改此值,使用默认即可。

 9、$or查询

满足其中之一的条件就可以显示,类似mysql的中的or条件语法
select * from goods where price > 5000 or number >= 100

db.goods.find({'$or':[{price:{'$gt':5000}},{number:{'$gte':100}}]})

10、count 语法

返回结果的数量统计

链式操作

db.goods.count()
db.goods.find({price:{'$gt':5000}}).count()
db.goods.count({price:{'$gt':5000}})

 

 11、limit语法 skip语法

类似于mysql中的limit(skip,length)语法
limit()  取几个
skip()   跳过几个
db.goods.find().limit(1);

db.goods.find().skip(1).limit(1);

mongodb语法和SQL语句的对比

 

 (三)修改数据

 1、语法:

db.集合名称.update({查询条件},{修改条件})
db.集合名称.updateOne()  修改匹配的第一条
db.集合名称.updateMany()  修改匹配所有条

2、有$set的修改

db.goods.update({name:'iphonex'},{'$set':{price:8500}})
   

db.没有$set的修改goods.updateOne({name:'xiaomi5'},{'$set':{price:1500}})

3、 没有$set的修改

没有$set关键字语法,把设置的字段进行修改,没有设置的就会被删除掉

db.goods.update({name:'iphonex'},{price:8550})

 (四)删除数据

1、删除记录

db.集合名称.remove({查询条件})

db.集合名称.deleteOne()  删除匹配的第一条

db.集合名称.deleteMany()  删除匹配的多条

db.goods.remove({price:8550})

db.goods.deleteMany({price:{'$lte':2000}})

 

2、删除字段

可以删除某个字段的操作,使用的是update语法的$unset

db.goods.update({name:'huawei01'},{'$unset':{weight:0}})

值给一个就可以删除了

真实业务当中,一般不做物理删除,会使用一个标识,来确认是否已经被删除的数据

 五、安全设置

https://docs.mongodb.com/manual/tutorial/create-users/       

mongodb安全事件:https://www.jianshu.com/p/48d17a69e190

(一)限制登录

1、使用另外一台虚拟机,使用mongo命令行端进行测试

远程登录方法

2、关闭mongodb

正常情况下不要kill -9 mongod,使用mongo命令客户端里的关机命令

3、 添加启动的脚本,启动mongod

shell > vim /etc/init.d/mongodb

 

bind绑定是外网通讯的网卡   --bind_ip_all表示绑定0.0.0.0这个任意地址

 4、使用远程登录mongod服务

(二) 用户权限管理

1、需求

设置一个超级管理员账户,对于所有库具有读写权限

2、语法:

db.createUser({user:"root",pwd:"root",roles:["root"]})

3、实现步骤:

①切换admin库,进行用户创建

②关闭mongod服务,重启添加权限参数并启动

关闭

在启动脚本中加入--auth参数

 ③测试使用

 添加用户,限制用的库的权限,只读

 六、业务实例

 (一)PHP扩展安装

1、上传php扩展包

如果没有phpize这个命令,需要yum安装php-devel

2、解压编译安装

shell > yum -y install php-devel  #安装phpize
shell > tar xvf mongodb-1.5.3.tgz
shell > cd mongodb-1.5.3
shell > phpize
shell > ./configure && make && make install

3、添加php.ini匹配

shell > vim /usr/local/php/etc/php.ini

4、重启php-fpm查看phpinfo

shell > service php-fpm restart

 (二)桌面管理使用

 1、软件是绿色版本,直接解压,点击使用即可

 

2、填写相关参数

 

 

 3、测试是否可以正常连接

 

4、点击连接

 5、查看数据

 (三)日志统计展示

1、很多网站需要统计某个页面或者某个功能访问量,如果访问量比较大,需要记录的组件具有很快的读写效率。可以使用功能性更多的mongodb来完成此业务。mongodb具有更多的数据灵活性。

2、网站访问日志记录的信息:

ip 用户访问的来源ip
url  用户访问的地址  功能模块页面地址
time  访问时间  记录用户访问的时间值
user_agent 用户访问的客户端信息

3、使用服务器

web1(server01)->mycat(server07)->master(server02)->slave(server06)->cache(server08)->mongodb(server10)

4、Tip:nginx负载均衡服务器解决后端服务获取不到真实用户IP的方式

①在负载均衡nginx服务器,填写真实用户IP的转发

注意如果使用负载均衡,后端获取的IP为负载均衡代理的IP。

如果后端需要获取到真是的IP,负载均衡服务器,必须要配置参数,把真实IP进行传输 

②web服务器的nginx需要配置接收真实的用户IP,需要使用到模块--with-http_realip_module,在编译安装nginx时需要加入

③配置语法

④操作实现步骤:

 (1)删除原来的文件

(2)上传修改好的文件

(3)访问页面之后,可以查看到访问已经被记录

php中获取代理的真实IP的方式,但是一定要注意必须是代理服务器有传真实IP

 

 

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

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

相关文章

jmeter 5.1彻底解决中文上传乱码

1.修改源码,然后重新打jar包,就是所有上传文件名重新获取文件名 参考链接:多种Jmeter中文乱码问题处理方法 - 51Testing软件测试网 2.修改Advanced,必须选java

电商系统架构设计系列(七):如何构建一个电商的商品搜索系统?

上篇文章中&#xff0c;我给你留了一个思考题&#xff1a;如何构建一个商品搜索系统&#xff1f; 今天这篇文章&#xff0c;我们来说一下电商的商品搜索系统。 引言 搜索这个特性可以说是无处不在&#xff0c;现在很少有网站或者系统不提供搜索功能了&#xff0c;所以&#xf…

Unity Shader:常用的C#与shader交互的方法

俗话说久病成医&#xff0c;虽然不是专业技术美术&#xff0c;但代码写久了自然会积累一些常用的shader交互方法。零零散散的&#xff0c;总结如下&#xff1a; 1&#xff0c;改变UGUI的材质球属性 有时候我们需要改变ui的一些属性&#xff0c;从而实现想要的效果。通常UGUI上…

GEE:矢量数据去除重复值(输出样本点数据的标签信息)

作者:CSDN @ _养乐多_ 本文记录了在GoogleEarthEngine(GEE)平台上,将样本点数据中某个字段的值去除重复值,并将剩下的值打印到控制台的代码。该代码可以用于快速在GEE平台上查询土地利用分类信息中landcover的类别信息。 矢量数据信息如下所示, 打印结果如下所示, 文章…

【Linux】【docker】安装sonarQube免费社区版9.9

文章目录 sonarQube 镜像容器Linux 安装镜像出现 Permission denied的异常安装sonarQube 中文包重启服务 代码上传到sonarQube扫描配置 JS TS Php Go Python sonarQube 镜像容器 老样子第一步还是打开镜像容器官网https://hub.docker.com搜索sonarqube官方推荐的挂载目录 我就按…

LeetCode 热题 100 JavaScript --226. 翻转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 3&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 提示&#xff1a; 树中节点数目范围在 [0, 100] 内 -100 < Node.val < 100 var invertTree function(root…

使用“纯”Servlet做一个单表的CRUD操作

1. 项目说明 介绍&#xff1a; 这里我们使用 纯粹 的 Servlet 完成单表【对部门的】的增删改查操作。&#xff08;B/S结构的。&#xff09; 结构图 初始的欢迎页面 部门列表页面 部门详情 修改部门 删除部门&#xff1a; 新增部门&#xff1a; 2. 具体对应的功能的代码实现 …

为什么马斯克和奥特曼都想重振加密货币?

1、前言 加密货币已经死了吗&#xff1f;这个问题的答案取决于谁来回答。一个加密爱好者会给你一百个不同的理由来解释为什么加密货币没有死。特斯拉CEO埃隆马斯克和OpenAI CEO 山姆奥特曼都对加密货币及其在塑造未来世界中的潜在作用有着浓厚的兴趣。 在过去很长一段时间里&…

Ubuntu18.04 安装opencv 4.8.0教程

1. 安装准备 安装前需要下载一些必须的依赖项。 不同版本opencv依赖会有不同&#xff0c;具体见官网opencv安装 sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-…

视频汇聚平台EasyCVR视频广场侧边栏支持拖拽

为了提升用户体验以及让平台的操作更加符合用户使用习惯&#xff0c;我们在EasyCVR v3.3版本中&#xff0c;支持面包屑侧边栏的广场视频、分组列表、收藏这三个模块拖拽排序&#xff0c;并且该操作在视频广场、视频调阅、电子地图、录像回放等页面均能支持。 TSINGSEE青犀视频…

InfluxDB2如何求增量数据

需求 项目中需要接入电表设备&#xff0c;求用电量。 按天和设备统计用电量 按天统计用电量 统计总用电量 存在的问题 difference 函数可以求增量&#xff0c;但是以上计算均存在一个问题&#xff0c;比如xx设备有8.1号和8.2号的数据&#xff0c;我统计每天的用电量&#xf…

单篇笔记曝光248万+,素颜、寸头…小红书女性种草新趋势分析!

最近&#xff0c;小红书上刮起一阵素颜、寸头&#xff0c;拒绝美丽绑架的风潮&#xff0c;他们称之为“脱美役”&#xff0c;即脱离美丽枷锁&#xff0c;做自己&#xff0c;接纳原本的自己。这是女性觉醒的又一阵风&#xff0c;品牌要如何跟上这波种草新趋势呢&#xff1f; 单篇…

Swish for MacBook触控板窗口管理软件

Swish可以帮助您使用触控板&#xff0c;轻松对mac窗口进行管理&#xff0c;只需提前设置好预定的设置即可&#xff0c;非常方便&#xff01; 几乎所有的窗口管理工具用的都是快捷键或者鼠标拖移的方式来管理窗口&#xff0c;Swish 却另辟蹊径&#xff0c;为窗口管理引入了手势…

c语言——计算两个数值的最小公倍数

//计算两个数值的最小公倍数 //列如&#xff1a;4和6的最小公倍数是12. #include<stdio.h> int main() {int a,b,temp,i;printf("Input a&b:");scanf("%d,%d",&a,&b);if(a<b){tempa;ab;btemp;}for(ia;i>0;i)if(i%a0&&i%b0…

物联网|按键实验---学习I/O的输入及中断的编程|函数说明的格式|如何使用CMSIS的延时|读取通过外部中断实现按键捕获代码的实现及分析-学习笔记(14)

文章目录 通过外部中断实现按键捕获代码的实现及分析Tip1:函数说明的格式Tip2:如何使用CMSIS的延时GetTick函数原型stm32f407_intr_handle.c解析中断处理函数&#xff1a;void EXTI4_IRQHandler 调试流程软件模拟调试 两种代码的比较课后作业: 通过外部中断实现按键捕获代码的实…

【雕爷学编程】MicroPython动手做(39)——机器视觉之图像基础3

MixPY——让爱(AI)触手可及 MixPY布局 主控芯片&#xff1a;K210&#xff08;64位双核带硬件FPU和卷积加速器的 RISC-V CPU&#xff09; 显示屏&#xff1a;LCD_2.8寸 320*240分辨率&#xff0c;支持电阻触摸 摄像头&#xff1a;OV2640&#xff0c;200W像素 扬声器&#…

使用 PowerShell 来揪出端口罪魁祸首

问题&#xff1a; 在调试 Node.js 程序时经常出现端口被占用的情况是很常见的。为了找到具体是哪个进程占用了 3000 端口&#xff0c;我们可以借助一些工具来查找。下面将展示一种方法&#xff1a;使用 PowerShell 。 方法&#xff1a;使用 PowerShell 打开 PowerShell 终端…

TypeScript 类型断言

TypeScript 类型断言 简单来说类型断言就是 使用as关键词 强行指定获取到的结果类型 应用场景 // 类型断言: 强行指定获取到的结果类型// 应用场景// 页面上有一个 id 为 link 的 a 标签// 我们知道它是 a 标签// 但是 TS 不知道 // document.getElementById 的返回值是 HTMLE…

【JAVA BASE API】介绍Java基础API语法,包括JAVA8之后的时间日期等

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; Java | 从跨平台到跨行业 开发工具&#xff1a;IntelliJ IDEA JAVA BASE API Object 类clone 对象克隆toString() 转换字符串equals(Object obj) 地址比较 Objects 类Objects.equals(Object obj1, Object obj2) 非空比较…

react ant add/change created_at

1.引入ant的 Table import { Table, Space, Button, message } from antd; 2.获得接口的数据的时候增加上创建时间 const response await axios.get(${Config.BASE_URL}/api/v1/calculation_plans?token${getToken()});if (response.data.message ok) {const data respon…