本文共 18389 字,大约阅读时间需要 61 分钟。
转载来源 :MongoDB快速入门 : https://mp.weixin.qq.com/s/dgDyJ0PwtHswGykX9UED6w
随着大数据时代的到来,数据急速增长,导致关系型数据库(SQL)越来越不够用。高性能、可扩展的数据库变得越来越重要起来,在这样的场景下,非关系型数据库(NoSQL)应运而生,这里的“NoSQL”不是“NoSQL(不是SQL)”,而是“Not only SQL(不仅是SQL)”的简称。2009年,分布式文档型数据库MongoDB引发了一场去SQL的浪潮。
MongoDB适合储存大量关联性不强的数据。MongoDB中的数据以“库”—“集合”—“文档”—“字段”结构进行储存。这种结构咋看和传统关系型数据库的“库”—“表”—“行”—“列”结构非常像。但是,MongoDB不需要预先定义表结构,数据的字段可以任意变动,并发写入速度也远远超过传统关系型数据库。
对于少量数据,可以使用“记事本”程序来保存。但如果需要对数据进行计算,那么记事本显然就不能胜任了。此时可以考虑 Excel。还可以使用Excel 的数据透视表来统计数据,如图所示。
使用MongoDB保存数据使用数据库,可以保存大量的数据,这是数据库最基本的功能。另外,数据库还能够对数据进行逻辑运算、数学运算、搜索、批量修改或删除。相比于传统的关系型数据库,MongoDB对于每一次插入的字段格式没有要求,字段可以随意变动,字段类型也可以随意变动,如图所示。
会介绍MongoDB的安装和基本语法。另外,介绍在图形化管理工具Robo 3T中操作MongoDB,以及使用Python操作MongoDB的方法
MongoDB的语法与Python非常相似。在很多情况下,操作MongoDB的代码都可以直接用到Python中。所以,结合Python来学习MongoDB可以起到事半功倍的效果
SQL与MongoDB术语对比见
1.2.1 在Windows中安装
由于 Linux 有众多的发行版,不同发行版本有不同的包管理工具,所以在各个发行版本中安装MongoDB的命令可能会有一些差异。本文以Centos7.6为例,来说明如何安装MongoDB。
1.配置MongoDB的yum源 创建yum源文件添加以下内容:(我们这里使用阿里云的源,安装的是4.25版本)
[root@localhost ]# cd /etc/yum.repos.d[root@localhost yum.repos.d]# vim mongodb-org-4.2.repo[mngodb-org]name=MongoDB Repositorybaseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/4.2/x86_64/gpgcheck=0enabled=1
这里可以修改 gpgcheck=0, 省去gpg验证
安装之前先更新所有包 :
[root@localhost yum.repos.d]# yum update
2.安装MongoDB
安装命令:[root@localhost yum.repos.d]# yum -y install mongodb-org
安装完成后
查看mongo安装位置 whereis mongod
[root@localhost yum.repos.d]# whereis mongodmongod: /usr/bin/mongod /etc/mongod.conf /usr/share/man/man1/mongod.1
查看修改配置文件 :vim /etc/mongod.conf
bindIp: 172.0.0.1 改为 bindIp: 0.0.0.0
(注意冒号与ip之间需要一个空格)
[root@localhost yum.repos.d]# cat /etc/mongod.conf# mongod.conf# for documentation of all options, see:# http://docs.mongodb.org/manual/reference/configuration-options/# where to write logging data.systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log# Where and how to store data.storage: dbPath: /var/lib/mongo journal: enabled: true# engine:# wiredTiger:# how the process runsprocessManagement: fork: true # fork and run in background pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile timeZoneInfo: /usr/share/zoneinfo# network interfacesnet: port: 27017 bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.#security:#operationProfiling:#replication:#sharding:## Enterprise-Only Options#auditLog:#snmp:
启动mongodb :systemctl start mongod.service停止mongodb :systemctl stop mongod.service查到mongodb的状态:systemctl status mongod.service设置开启自启动:systemctl enable mongod.service
[root@localhost yum.repos.d]# systemctl status mongod.service● mongod.service - MongoDB Database Server Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2020-04-04 16:01:31 CST; 8s ago Docs: https://docs.mongodb.org/manual Process: 5492 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=0/SUCCESS) Process: 5488 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS) Process: 5485 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS) Process: 5481 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS) Main PID: 5495 (mongod) CGroup: /system.slice/mongod.service └─5495 /usr/bin/mongod -f /etc/mongod.confApr 04 16:01:30 localhost.localdomain systemd[1]: Starting MongoDB Database Server...Apr 04 16:01:30 localhost.localdomain mongod[5492]: about to fork child process, waiting until server is ready for connections.Apr 04 16:01:30 localhost.localdomain mongod[5492]: forked process: 5495Apr 04 16:01:31 localhost.localdomain mongod[5492]: child process started successfully, parent exitingApr 04 16:01:31 localhost.localdomain systemd[1]: Started MongoDB Database Server.
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙。
关闭firewall:
systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启动
vim /etc/sysconfig/iptables
iptables文件添加
-A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT
(注意:-A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT要加在-A INPUT -j REJECT --reject-with icmp-host-prohibited之前,不然启动无效)
从官方网站上,根据自己的操作系统版本,选择需要下载的rpm包,我这里下载的是4.2.2的版本,对应的操作系统是RHEL7
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-server-4.2.2-1.el7.x86_64.rpmwget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-shell-4.2.2-1.el7.x86_64.rpmwget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-tools-4.2.2-1.el7.x86_64.rpmwget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-mongos-4.2.2-1.el7.x86_64.rpm
rpm包下载完成之后,先安装mongo的服务端
rpm -ivh mongodb-org-server-4.2.2-1.el7.x86_64.rpm
如果想连接到mongo数据库,需要安装mongo shell组件
rpm -ivh mongodb-org-shell-4.2.2-1.el7.x86_64.rpm
mongo官方还提供了一组工具集,如果需要可以安装mongo tools
rpm -ivh mongodb-org-tools-4.2.2-1.el7.x86_64.rpm
如果想要搭建高可用集群,则需要安装mongos包,在这里就不介绍了,下次再介绍怎么搭建mongo集群环境
rpm -ivh mongodb-org-mongos-4.2.2-1.el7.x86_64.rpm
安装好mongo server,mongo shell,mongo tools之后,就可以开始配置mongo数据库参数了,默认的mongo配置文件在/etc/下
/etc/mongod.conf
我们可以修改mongo日志存放路径,数据存放路径,远程IP访问,修改配置如下所示
systemLog: destination: file logAppend: true path: /mongo/log/mongod.logstorage: dbPath: /mongo/data journal: enabled: true net: port: 27017 bindIp: 0.0.0.0
bindIp如果使用默认的127.0.0.1,则只能本地IP才能访问mongo数据库,远程则无法访问mongo数据库。
修改好之后,就可以启动mongo数据库了systemctl start mongod
数据库启动之后,就可以用mongo shell连接数据库了,下面简单介绍一下mongo操作
##登录数据库[root@ mongo]# mongo##查看当前数据库> show dbs;admin 0.000GBconfig 0.000GBlocal 0.000GB##创建新数据库> use testdb;switched to db testdb##向数据库testdb的集合t_1中插入一条记录> db.t_1.insert({"name":"tlesjofj","modtime":"8473"});WriteResult({ "nInserted" : 1 })##查看当前数据库已有的集合> show collections;t_1##查询集合t_1的所有数据> db.t_1.find();{ "_id" : ObjectId("5df87ea9d824098cd42fb2e8"), "name" : "tlesjofj", "modtime" : "8473" }##带条件查询> db.t_1.find({"modtime":"8473"});{ "_id" : ObjectId("5df87ea9d824098cd42fb2e8"), "name" : "tlesjofj", "modtime" : "8473" }
参考链接 :
https://mp.weixin.qq.com/s/M_TIF9r2TiNw7XRlW8jguw
MongoDB虽然自带了一个终端环境下的客户端,但是操作起来比较繁琐,数据显示也不够直观,因此需要使用一个图形界面管理软件来提高MongoDB数据的可读性。
3.1 安装 Robo 3T是一个跨平台的MongoDB管理工具,采用图形界面查询或者修改MongoDB。Robo 3T的下载地址为:https://robomongo.org/download。在下载页面中可以看到另一个叫作 Studio 3T 的软件,它是一个功能更加强大的MongoDB图形化管理软件,但它是一个商业软件,需要收费,而Robo 3T是开源软件并且免费,它的功能足够应付本书的所有应用场景,因此本文选择使用Robo 3T。Robo 3T的主界面如图所示。重点关注A、B、C三个区域。
在A区域中,单击数据库图标左边的箭头,展开数据库;单击“Collections”左边的箭头,展开集合。双击集合的名字,则B区域和C区域发生相应的变化。
增、查、改、删是所有数据库必备的功能。本节将介绍如何使用MongoDB 来实现这四个功能。
4.1 创建数据库与集合,写入数据 在Robo 3T中进行如下操作:插入单条数据的命令为“insertOne()”,Robo 3T自带插入数据的功能,但是在此不介绍了,本文会直接介绍如何在C区域执行MongoDB命令插入数据。
(1)创建一条JSON字符串例如:
{ "name": "王小二", "age": 17, "address": "浙江"}
(2)对C区域的内容做一些修改
db.getCollection('example_data_1').find({ })
修改为:
db.getCollection('example_data_1').insertOne({ "name": " 王小二 ","age": 17,"address": "浙江"})
(3)使用Windows与Linux的读者,可以按键盘上的“Ctrl + R”组合键,运行后的界面如图所示。可以看到,一条数据已经插入到了MongoDB中
提示:还可以通过单击Robo 3T上面的绿色三角形来运行命令
{ "name": "张小二", "age": 17, "address": "浙江"}
提示:JSON字符串必须使用双引号,不过这个规定在MongoDB中并非强制性的,用单引号也没有问题。例如,在C区域执行以下命令:
db.getCollection(‘example_data_1’).insertOne({‘name’: ‘王小六’,‘age’: 23, ‘work’: ‘运维工程师’})
如果将Python的字典直接复制到MongoDB的insertOne命令中,则绝大部分情况下这些字典都可以直接使用,只有极少数情况下需要做一些修改,后面会讲到这些少数情况
提示:MongoDB还允许Key不带引号,直接写成{ name: '王小六', age: 23,work: '运维工程师'}但这种写法存在一些局限性,并且会导致MongoDB的命令不方便平滑移植到Python中。因此,建议读者一律使用带单引号的写法或者带双引号的写法
db.getCollection('example_data_1').insertOne({ "hello": "world","sex": "男","职位": "程序员"})
这一次所有的字段都和前两条数据不一样,但 MongoDB 仍然可以轻松处理——遇到新来的字段,加上去就是了,没什么大不了的,如图所示:
db.getCollection('example_data_1').insertOne({ "name": "1024","age": "十岁","address": "3.5"})
添加后的数据如图所示:
提示:“能不能做”是一回事,“应不应该做”是另一回事。虽然MongoDB能够处理同一个字段的不同数据类型,也可以随意增减字段,但并不意味着应该这样做。在设计数据库时,应尽量保证同一个字段使用同一种类型的数据,并提前考虑好应该有哪些字段。
批量插入数据的命令是“insertMany”,把一个包含很多个字典的列表传给“insertMany”。
列表为:data_list = [ { 'name': '赵小三','age':20,'address':'北京'}, { 'name': '钱小四','age':21,'address':'上海'}, { 'name': '孙小五','age':20,'address':'山东'}, { 'name': '李小六','age':23,'address':'河北'}, { 'name': '欧阳小七','age':24,'address':'杭州'},]
对应的MongoDB批量插入语句为:
db.getCollection('example_data_1').insertMany([ { 'name': '赵小三','age':20,'address':'北京'}, { 'name': '钱小四','age':21,'address':'上海'}, { 'name': '孙小五','age':20,'address':'山东'}, { 'name': '李小六','age':23,'address':'河北'}, { 'name': '欧阳小七','age':24,'address':'杭州'} ])
运行后返回的数据如图所示:
提示:可以通过换行和缩进让代码更美观、易读。换行和缩进不影响代码功能
运行以后的集合数据如图所示:
提示:_id的前8位字符转换为十进制就是时间戳。例如“5b2f2e24e0f42944105c81d2”,前8位字符“5b2f2e24”转换为十进制就是时间戳“1529818660”,对应的北京时间是“2018-06-2413:37:40”
对数据集example_data_1进行如下查询:
(1)查询所有数据(2)查询特定数据:查询“age”为25岁的员工(3)查询特定数据:查询“age”不小于25的所有记录(4)限定返回的数据字段类型
在Robo 3T中双击集合名字,实际上是自动执行了以下这条查询语句:
db.getCollection('example_data_1').find({ })
下面先来了解一下查询结果的三种显示模式
Robo 3T显示出来的查询结果如图所示,注意右上角方框框住的三个图标。
提示:这三种显示模式是Robo 3T提供的,不是MongoDB的功能。
db.getCollection('example_data_1').find()
或
db.getCollection('example_data_1').find({ })
例如,对于数据集 example_data_1,要查询所有“age”字段为25的记录。则查询语句可以写为:```
db.getCollection('example_data_1').find({ 'age': 23})
查询结果如图所示:
db.getCollection('example_data_1').find({ 'age': 23,'name':'王小六'})
运行结果如图所示:
如要查询的字段值能够比较大小,则查询时可以限定值的范围,例如,对数据集example_data_1,要查询所有“age”字段不小于25的记录,则需要使用大于等于操作符“$gte”。查询语句如下:
db.getCollection('example_data_1').find({ 'age': { '$gte': 23}})
运行效果如图所示:
db.getCollection('example_data_1').find({ 'age': { '操作符1': 边界1,'操作符2': 边界2}})
可以看出,在使用范围操作符后,原本填写被查询值的地方现在又变成了一个字典。这个字典的Key是各个范围操作符,而它们的值是各个范围的边界值。
【举例1】查询所有“age”大于21并小于等于24的数据,查询语句如下:db.getCollection('example_data_1').find({ 'age': { '$lt': 24, '$gt': 21}})
【举例2】查询所有“age”大于21并小于等于24的数据,且“name”不为“夏侯小七”的记录
db.getCollection('example_data_1').find({ 'age': { '$lt': 24, '$gt': 21 }, 'name':{ '$ne':'欧阳小七'}})
“find”命令可以接收两个参数:第1个参数用于过滤不同的记录,第2个参数用于修改返回的字段,如果省略第2个参数,则MongoDB会返回所有的字段。如要限定字段,则查询语句的格式如下:
db.getCollection('example_data_1').find(用于过滤记录的字典,用于限定字段的字典)
其中,用于限定字段的字典的Key为各个字段名。其值只有两个——0或1。
db.getCollection('example_data_1').find({ }, { 'address': 0, 'age': 0})
运行结果为如图所示:
db.getCollection('example_data_1').find({ }, { 'name': 1, 'age': 1})
运行效果如所示:
(1)如果只要A、B、C,则没有提到的自然都是不需要的
(2)如果除A、B、C外其他的全都要,则没有提到的自然全都是需要的
提示:只有“_id”很特别,不论其他字段的值是0还是1,如果不需要返回“_id”,则需要把它的值设为0
db.getCollection('example_data_1').find({ 'age': { '$gt': 21}}).count()
运行结果如图所示。返回数字“3”表示有3条记录满足要求
如果查询的结果非常多,则可能需要限定返回结果。此时就需要使用“limit()”命令。它的用法如下:
db.getCollection('example_data_1').find().limit(限制返回的条数)
db.getCollection('example_data_1').find().limit(4)
运行效果如图所示:
db.getCollection('example_data_1').find({ 'age': { '$gt':21}}).sort({ '字段名': -1或者1})
其中,字段的值为-1表示倒序,为1表示正序。例如,对所有“age”大于21的数据,按“age”进行倒序排列。查询语句如下:
db.getCollection('example_data_1').find({ 'age': { '$gt':21}}).sort({ 'age': -1})
运行如下:
实例描述数据集 example_data_1,“name”为“王小六”的这个记录是没有“address”字段的。现在需要为它增加这个字段,同时把“work”从“运维工程师”改为“DBA”。
(1)更新集合中的单条数据。
(2)批量更新同一个集合中的多条数据。 修改操作也就是更新(Update)操作,对应的 MongoDB 命令为“updateOne()”和“updateMany()”。这两个命令只有以下区别,它们的参数完全一致。
1.更新操作的语法
db.getCollection('example_data_1').updateMany( 参数1:查询语句的第一个字典, { 'set':{ '字段1':'新的值1','字段2','新的值2'}})
updateMany的第1个参数和“find”的第1个参数完全一样,也是一个字典,用来寻找所有需要被更新的记录。第2个参数是一个字典,它的Key为“$set”,它的值为另一个字典。这个字典里面是需要被修改的字段名和新的值。
举例: 修改“name”为“王小六”的文档,添加“address”字段,并“work”从“运维工程师”改为“DBA”db.getCollection('example_data_1').updateMany( { 'name':'王小六'}, { '$set':{ 'address':'苏州','work':'DBA'}})
例如,要从数据集example_data_1中删除字段“hello”值为“world”的这一条记录。
(1)从集合中删除单条数据 (2)从集合中批量删除多条数据 只要会查询数据,就会删除数据。为了防止误删数据,一般的做法是先查询要删除的数据,然后再将查出的数据删除;db.getCollection('example_data_1').find({ 'hello': 'world'})
运行效果如图所示:
db.getCollection('example_data_1').deleteMany({ 'hello': 'world'})
提示:慎用删除功能。一般工程上会使用“假删除”,即:在文档里面增加一个字段“deleted”,如果值为0则表示没有删除,如果值为1则表示已经被删除了。默认情况下,deleted字段的值都是0,如需要执行删除操作,则把这个字段的值更新为1。而查询数据时,只查询deleted为0的数据。这样就实现了和删除一样的效果,即使误操作了也可以轻易恢复
在数据集example_data_1中,进行以下两个去重操作。
(1)对“age”字段去重 (2)查询所有“age”大于等于24的数据,再对“age”进行去重。去重操作用到的命令为“distinct()”格式如下:
db.getCollection('example_data_1').distinct('字段名', 查询语句的第一个字典)
distinct()可以接收两个参数:
db.getCollection('example_data_1').distinct('age
运行效果如图所示:
db.getCollection('example_data_1').distinct( 'age', { 'age':{ '$gte':20}})
运行结果:
提示:能否去重以后再带上其他字段呢?答案是,用“distinct()”命令不能实现。要实现这个功能,后面介绍
因为公司监控系统获取的应用监控指标数据,需要存放在mongo数据库,最近就开始研究一下mongo数据库,先从最简单的mongo数据库安装和简单使用,和大家做一下分享。
从官方网站上,根据自己的操作系统版本,选择需要下载的rpm包,我这里下载的是4.2.2的版本,对应的操作系统是RHEL7
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-server-4.2.2-1.el7.x86_64.rpmwget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-shell-4.2.2-1.el7.x86_64.rpmwget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-tools-4.2.2-1.el7.x86_64.rpmwget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-mongos-4.2.2-1.el7.x86_64.rpm
rpm包下载完成之后,先安装mongo的服务端
rpm -ivh mongodb-org-server-4.2.2-1.el7.x86_64.rpm
如果想连接到mongo数据库,需要安装mongo shell组件
rpm -ivh mongodb-org-shell-4.2.2-1.el7.x86_64.rpm
mongo官方还提供了一组工具集,如果需要可以安装mongo tools
rpm -ivh mongodb-org-tools-4.2.2-1.el7.x86_64.rpm
如果想要搭建高可用集群,则需要安装mongos包,在这里就不介绍了,下次再介绍怎么搭建mongo集群环境
rpm -ivh mongodb-org-mongos-4.2.2-1.el7.x86_64.rpm
/etc/mongod.conf
我们可以修改mongo日志存放路径,数据存放路径,远程IP访问,修改配置如下所示systemLog: destination: file logAppend: true path: /mongo/log/mongod.logstorage: dbPath: /mongo/data journal: enabled: true net: port: 27017 bindIp: 0.0.0.0
bindIp如果使用默认的127.0.0.1,则只能本地IP才能访问mongo数据库,远程则无法访问mongo数据库。
修改好之后,就可以启动mongo数据库了
systemctl start mongod
数据库启动之后,就可以用mongo shell连接数据库了,下面简单介绍一下mongo操作
##登录数据库[root@ mongo]# mongo##查看当前数据库> show dbs;admin 0.000GBconfig 0.000GBlocal 0.000GB##创建新数据库> use testdb;switched to db testdb##向数据库testdb的集合t_1中插入一条记录> db.t_1.insert({ "name":"tlesjofj","modtime":"8473"});WriteResult({ "nInserted" : 1 })##查看当前数据库已有的集合> show collections;t_1##查询集合t_1的所有数据> db.t_1.find();{ "_id" : ObjectId("5df87ea9d824098cd42fb2e8"), "name" : "tlesjofj", "modtime" : "8473" }##带条件查询> db.t_1.find({ "modtime":"8473"});{ "_id" : ObjectId("5df87ea9d824098cd42fb2e8"), "name" : "tlesjofj", "modtime" : "8473" }
Centos7.6下安装mongo数据库 : https://mp.weixin.qq.com/s/M_TIF9r2TiNw7XRlW8jguw
转载来源 :MongoDB快速入门 : https://mp.weixin.qq.com/s/dgDyJ0PwtHswGykX9UED6w