当前位置: 首页 > news >正文

企业架构NOSQL数据库之MongoDB

目录

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

(一)业务背景描述

(二)模拟运维设计方案

二、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

 

 

相关文章:

企业架构NOSQL数据库之MongoDB

目录 一、背景描述及其方案设计 (一)业务背景描述 &#xff08;二&#xff09;模拟运维设计方案 二、Mongodb介绍 &#xff08;一&#xff09;nosql介绍 &#xff08;二&#xff09;产品特点 1、存储性 2、 效率性 3、结构 三、安装和配置 &#xff08;一&#xff09…...

鸟哥马哥共叙Linux发展

导读北京时间3月28日&#xff0c;由51CTO学院和人民邮电出版社信息技术分社联合举办的[开放见远]“鸟哥”大陆行Linux技术沙龙在位于北京市西三环久凌大厦的51CTO学院举行。 台湾著名Linux网站——“鸟哥的Linux私房菜”站长蔡德明&#xff0c;51CTO学院讲师马哥教育创始人马永…...

OpenCV中常用算子

一、图像运算 Mat src, src1, src2, dst;// 图像运算 加 减 乘 除cv::add(src1, src2, dst); // 相加&#xff1a;src1src2cv::scaleAdd(src1, 1.0, src2, dst); // 相加&#xff1a;1.0*src1src2cv::addWeighted(src1, 0.3, src2, 0.7,…...

Android 11.0 系统限制上网系列之iptables用IOemNetd实现app某个时间段禁止上网的功能实现

1.前言 在11.0的系统rom定制化开发中,对于系统限制网络的使用,在system中netd网络这块的产品需要中,会要求设置app某个时间段禁止上网的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现app某个时间段禁止上网的的相关功能,就是在 系统中只能允许…...

【JavaSE】面向对象编程思想之继承

【本节目标】 1. 继承 2. 组合 目录 1. 为什么需要继承 2. 继承概念 3. 继承的语法 4. 父类成员访问 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. 子类构造方法 7. super和this 8. 再谈初始化 9. protected 关键字 10. 继承方式…...

Golang make和new的区别

make 和 new new函数 作用 分配内存设置零值返回指针 eg&#xff1a; type Student struct{name stringage int }func main(){//new 一个内建类型num : new(int)fmt.Println(*num) //打印&#xff1a;0//new一个自定义类型s : new(Student)s.name "yx"fmt.Prin…...

(前后端交互式)Ajax上传图片 + 更换背景图片

前后端交互图片文件 上传-图片 注意1&#xff1a;上传的图片必须在2MB以内 注意2&#xff1a;服务器端oss&#xff08;阿里云对象存储&#xff09;为了安全性&#xff0c;图片url网址不能直接在浏览器地址栏访问 请用img/背景图方式进行使用 上传图片的代码实现 \* 目标&#…...

自媒体常见玩法

有声小说转成视频 题材来源 喜马拉雅 工具 https://trace.moe/ 33台词找台词 文字转视频 题材来源 小说类APP书籍 音乐转视频...

【react】react生命周期钩子函数:

文章目录 一、生命周期概念:二、生命周期:三、挂载阶段&#xff08;constructor > render > componentDidMount&#xff09;&#xff1a;四、更新阶段&#xff08;render > componentDidUpdate&#xff09;&#xff1a;五、卸载阶段&#xff08;componentWillUnmount …...

CRM系统哪些功能可以个性化定制?

不同的企业有着不同的业务流程和需求&#xff0c;因此在选型时就需要一款可以个性化定制的CRM系统。下面说说可以个性化定制的CRM系统的功能和优势。 如何实现个性化定制&#xff1f; Zoho CRM支持个性化定制&#xff0c;您可以创建自定义功能模块、字段以及业务流程&#xf…...

51单片机(普中HC6800-EM3 V3.0)实验例程软件分析 实验二 LED闪烁

目录 前言 一、原理图及知识点介绍 二、代码分析 知识点四&#xff1a;delay(u16 i)这个函数为什么i1时&#xff0c;大约延时10us&#xff1f; 前言 已经是第二个实验了&#xff0c;上一个实验是点亮第一个LED灯&#xff0c;这个实验是LED的闪烁。 一、原理图及知识点介绍…...

PaperEdge 文档图像矫正

效果 地址&#xff1a; https://github.com/cvlab-stonybrook/PaperEdge...

入门NLTK:Python自然语言处理库初级教程

NLTK&#xff08;Natural Language Toolkit&#xff09;是一个Python库&#xff0c;用于实现自然语言处理&#xff08;NLP&#xff09;的许多任务。NLTK包括一些有用的工具和资源&#xff0c;如文本语料库、词性标注器、语法分析器等。在这篇初级教程中&#xff0c;我们将了解N…...

Android 死机问题学习笔记

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、死机系统简图二、死机的可能原因三、死机问题需要分析哪些数据四 、Java Backtrace 分析五、常见 Java backtrace 举例六、Native Backtrace七、Ke…...

企业内网终端安全无客户端准入控制技术实践

终端无代理/无客户端准入控制技术因其良好的用户体验而倍受创新企业的青睐。无代理/无客户端准入控制技术&#xff0c;顾名思义&#xff0c;是一种在网络中对终端实施访问控制的方法&#xff0c;无需依赖特定的客户端软件。 不同于银行、医院等传统行业的终端准入控制需求&…...

Android 开发代码规范

一. AndroidStudio开发工具规范 使用最新的稳定版本.统一文件的编码格式为utf-8. 清除每个类里面的无效的import导包.代码样式统一,比如&#xff0c;tab缩进4个空格&#xff0c;或者 tab size等如果没有特殊情况使用默认的配置即可。每行字数每行字符数不得超过 160 字符&…...

c语言(函数)

目录 何为函数 库函数 自定义函数 二分查找数组下标 链式访问 函数的声明 函数定义 递归 正向打印数字 打印字符个数 使用临时变量 递归(不使用临时变量) n的阶乘 一般形式 递归 斐波那契数 递归 正常做法 何为函数 在计算机科学中&#xff0c;子程序是一个…...

OPENCV C++(二)直方图+分离颜色通道+画圆画线画矩形

分离RGB彩图颜色通道 也就是把每种分量的亮度图提出来 vector<Mat> channels;split(image1, channels);Mat R channels.at(0);Mat G channels.at(1);Mat B channels.at(2); 这样R,G,B每个图就是这个图的颜色分量图了 图片的克隆&#xff0c;深拷贝&#xff01; Mat…...

SpringBoot(2.7.x)中使用PageHelper

如何在SpringBoot中使用PageHelper 先添加依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.12</version> </dependency>SpringBoot 2.6.x…...

【HarmonyOS】API9网络buffer图片加载

【引言】 HarmonyOS中加载网络图片常用的方法是直接给Image组件添加图片的网络地址&#xff0c;申请网络权限ohos.permission.INTERNET后就可以通过url加载对应的图片了&#xff0c;如HarmonyOS官网中的写法&#xff1a; Image(https://www.example.com/example.JPG) 【问题概…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...