10_企业架构NOSQL数据库之MongoDB

news2025/1/22 12:51:11

企业架构NOSQL数据库之MongoDB

学习目标和内容

1、能够简单描述MongoDB的使用特点

2、能够安装配置启动MongoDB

3、能够使用命令行客户端简单操作MongoDB

4、能够实现基本的数据操作

5、能够实现MongoDB基本安全设置

6、能够操作安装php的MongoDB扩展

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

1、业务背景描述

时间:2017.6.-2017.9

发布产品类型:互联网动态站点 商城

⽤户数量: 10000-12000(⽤户量猛增)

PV : 1000000-5000000(24小时访问次数总和)

QPS: 50-100*(每秒访问次数) 300

DAU: 2000~*000(每日活跃用户数)

根据业务需求:

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

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

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

2、模拟运维设计方案

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

①访问日志存储

②在mongo中筛选查看信息

二、Mongodb介绍

img

1、nosql介绍

数据库排名:DB-Engines Ranking - popularity ranking of database management systems

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

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

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

memcached redis 内存缓存数据库

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

2、产品特点

2.1、存储性

比较适合存储大量的没有规则、无序的数据。未经过处理的数据

存储量大:单表实现存储PB级别的数据 1PB = 1024TB

2.2、效率性

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

2.3、结构

三、安装和配置

1、安装方式介绍

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

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

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

③创建数据存储目录和日志目录

shell > cd /usr/local/mongodb
shell > mkdir data
shell > mkdir logs

④启动mongod服务

shell > cd /usr/local/mongodb/bin
shell > ./mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs/log.txt --fork
#可以通过进程和端口的方式检测是否启动成功
shell > ps aux|grep mongod
shell > netstat -lntp|grep mongod

参数介绍:

dbpath 数据存储路径

logpath 日志存储路径 指向到一个文件

fork 后台启动

auth 权限开启

bind_ip 指定绑定网卡ip

3、命令行客户端操作

四、数据结构类型操作 CURD

1、添加数据

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

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

创建一个库devops

语法:

db.集合名称.insert(bson格式数据)

1.1、普通数据添加

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

1.2、多维数据对象添加

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

1.3、数组信息添加

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

2、查询数据

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

findOne(查询条件)

2.1、笼统方式查询

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

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

2.2、条件限制查询

条件格式,所见及所得

db.goods.find({name:'xiaomimax'})
db.goods.findOne({name:'xiaomimax'})

2.3、范围条件查询

mysql < <= > >= !=

mongo $lt $lte $gt $gte $ne

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

2.4、多个条件查询

类似mysql中的AND语法

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

2.5、多维字段查询

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

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

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

2.6、数组条件查询

①查询满足其中之一即可显示

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

②满足查询条件所有的才可显示

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']}})

2.7、限制查询字段

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

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

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

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

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

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

2.8、$or查询

满足其中之一的条件就可以显示,类似mysql的中的or条件语法

select * from goods where price > 5000 or number >= 100

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

2.9、count 语法

返回结果的数量统计

链式操作

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

2.10、limit语法 skip语法

类似于mysql中的limit(skip,length)语法

limit() 取几个

skip() 跳过几个

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

mongodb语法和SQL语句的对比

3、修改数据

语法:db.集合名称.update({查询条件},{修改条件})

updateOne() 修改匹配的第一条

updateMany() 修改匹配所有条

3.1、有$set的修改

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

3.2、没有$set的修改

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

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

4、删除数据

4.1、删除记录

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

deleteOne() 删除匹配的第一条

deleteMany() 删除匹配的多条

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

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

4.2、删除字段

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

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

值给一个就可以删除了

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

五、安全设置

Create a User — MongoDB Manual

mongodb安全事件:谈谈最近MongoDB数据库勒索事件 - 简书

1、限制登录

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

远程登录方法

②关闭mongodb

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

③添加启动的脚本,启动mongod

shell > vim /etc/init.d/mongodb

bind绑定是外网通讯的网卡

④使用远程登录mongod服务

2、用户权限管理

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

语法:

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

实现步骤:

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

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

关闭

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

③测试使用

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

六、业务实例

1、PHP扩展安装

安装到web服务器server01和server03上

①上传php扩展包

②解压编译安装

shell > tar xvf mongodb-1.5.3.tgz
shell > cd mongodb-1.5.3
shell > phpize
shell > ./configure && make && make install

③添加php.ini匹配

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

④重启php-fpm查看phpinfo

shell > service php-fpm restart

2、桌面管理使用

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

填写相关参数

测试是否可以正常连接

点击连接

查看数据

3、日志统计展示

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

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

ip 用户访问的来源ip

url 用户访问的地址 功能模块页面地址

time 访问时间 记录用户访问的时间值

user_agent 用户访问的客户端信息

操作实现步骤:

①删除原来的文件

②上传修改好的文件

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

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

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

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

相关文章

Linux访问NFS存储及自动挂载

本章主要介绍NFS客户端的使用 创建NFS服务器并通过NFS共享一个目录在客户端上访问NFS共享的目录自动挂载的配置和使用 1.1 访问NFS存储 前面那篇介绍了本地存储&#xff0c;本章就来介绍如何使用网络上上的存储设备。NFS即网络文件系统&#xff0c;所实现的是Linux和Linux之…

IDEA快速生成lambda表达式的方法

IDEA快速生成lambda表达式的方法-CSDN博客 建议修改成 shift/

Redis对象

Redis根据基本数据结构构建了自己的一套对象系统。主要包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象 同时不同的对象都有属于自己的一些特定的redis指令集&#xff0c;而且每种对象也包括多种编码类型&#xff0c;和实现方式。 Redis对象结构 struct redisOb…

使用TouchSocket适配一个c++的自定义协议

这里写目录标题 说明一、新建项目二、创建适配器三、创建服务器和客户端3.1 服务器3.2 客户端3.3 客户端发送3.4 客户端接收3.5 服务器接收与发送 四、关于同步Send 说明 今天有小伙伴咨询我&#xff0c;他和同事&#xff08;c端&#xff09;协商了一个协议&#xff0c;如果使…

二叉树的右视图[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个二叉树的 根节点root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出…

强化学习第1天:强化学习概述

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​​ 文章目录 介绍 强化学习要素 强化学习任务示例 环境搭建&#xff1a;gym 基本用法 环境信息查看 创建智能体 过程可视化 完整代码 结语…

0基础学java-day15

一、泛型 1 泛型的理解和好处 1.1 看一个需求 【不小心加入其它类型&#xff0c;会导致出现类型转换异常】 package com.hspedu.generic;import java.util.ArrayList;/*** author 林然* version 1.0*/ public class Generic01 {SuppressWarnings("all")public st…

企业数字档案馆室建设指南

数字化时代&#xff0c;企业数字化转型已经成为当下各行业发展的必然趋势。企业数字化转型不仅仅是IT系统的升级&#xff0c;也包括企业内部各种文件、档案、合同等信息的数字化管理。因此&#xff0c;建设数字档案馆室也变得尤为重要。本篇文章将为您介绍企业数字档案馆室建设…

SpringMVC修炼之旅(2)基础入门

一、第一个程序 1.1环境配置 略 1.2代码实现 package com.itheima.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;//定义…

初识MQ——消息队列技术选型

文章目录 同步和异步通讯同步通讯异步通讯 技术对比 同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c…

CCF编程能力等级认证GESP—C++1级—20230318

CCF编程能力等级认证GESP—C1级—20230318 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)每月天数长方形面积 答案及解析单选题判断题编程题1编程题2 单选…

SQL手工注入漏洞测试(Sql Server数据库)-墨者

———靶场专栏——— 声明&#xff1a;文章由作者weoptions学习或练习过程中的步骤及思路&#xff0c;非正式答案&#xff0c;仅供学习和参考。 靶场背景&#xff1a; 来源&#xff1a; 墨者学院 简介&#xff1a; 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

国内AI翘楚,看看有没有你心动的offer?

科技创新争占高地&#xff0c;AI领域各显神通。从一战成名的阿尔法狗到引起轩然大波的ChatGPT&#xff0c;我们早已卷入了一场没有硝烟的革命。前方世人看到的科技日新日异、岁月静好&#xff0c;后方是各大企业的绞尽脑汁、争先恐后。人工智能时代&#xff0c;AI是挡不住的时代…

Lebesgue积分及应用

Lebesgue积分及应用 文章目录 Lebesgue积分及应用一、Lebesgue测度和可测函数1.1 Riemann积分和Lebesgue积分1.2 直线上的Lebesgue测度【定义】外测度&#xff08;Outer Measure&#xff09;【定理】外测度的性质【定义】内测度【定义】可测、Lebesgue测度【定理】卡氏条件&…

Java注册并监听全局快捷键

背景 之前在博客中分享了SWT托盘功能, 随之带来一个问题, 当程序最小化后无法快速唤醒, 按照平时使用软件的思路, 自然想到了注册全局快捷键, 本文介绍使用java方式实现全局快捷键的注册. 方案 通过google,搜到一个现成的库: jintellitype, 使用maven可以直接引用, 非常方便…

C语言易错知识点八(整形与浮点型在内存中存储的实质)

整形与浮点型在内存中存储的实质 当我们在刷抖音或者其他短视频平台时&#xff0c;可能会时不时(总是&#xff0c;我相信大家肯定是不会被外表骗到的那一类人ヾ(●゜ⅴ゜)&#xff89;)刷到各种帅哥美女的视频&#xff0c;或者我们在学校里看到帅哥美女时&#xff0c;如果我们只…

NFC和蓝牙在物联网中有什么意义?如何选择?

#NFC物联网# #蓝牙物联网# 在物联网中&#xff0c;NFC和蓝牙有什么意义&#xff1f; NFC在物联网中代表近场通信技术。它是一种短距离、高频的无线通信技术&#xff0c;可以在近距离内实现设备间的数据传输和识别。NFC技术主要用于移动支付、电子票务、门禁、移动身份识别、防…

Vue2中v-html引发的安全问题

前言&#xff1a;v-html指令 1.作用&#xff1a;向指定节点中渲染包含html结构的内容。 2.与插值语法的区别&#xff1a; (1).v-html会替换掉节点中所有的内容&#xff0c;{{xx}}则不会。 (2).v-html可以识别html结构。 3.严重注意&#xff1a;v-html有安全性问题&#xff0…

STM32串口接收数据包(自定义帧头帧尾)

1、基本概述 本实验基于stm32c8t6单片机&#xff0c;串口作为基础且重要的外设&#xff0c;具有广泛的应用。本文主要理解串口数据包的发送与接收是如何实现的&#xff0c;重要的是理解程序的实现思路。 2、关键程序 定义好需要用到的变量&#xff1a; uint8_t rxd_buf[4];//…

湖南麒麟下默认使用串口输出系统日志

有时候为了调试方便&#xff0c;需要将系统日志通过CPU的串口进行输出&#xff0c;以下是针对至强E5V4处理器上安装湖南麒麟操作系统后将日志通过串口输出的配置。 首先在bios中打开串口重定向功能&#xff0c;这里的BIOS是AMI的BIOS 内部配置如下&#xff0c;波特率115200配置…