- 一、MongoDB 介绍
- 二、安装MongoDB步骤
- 三、MongoDB数据库基本操作
- 1.进入MongoDB中的库(use命令)
- 2.创建集合 (db.createCollection命令创建)
- 3.查看所有集合(show collections命令)
- 4.插入数据("db.集合名.insert({"键名1":值1,"键2":值2,...})"命令)
- 5.利用for循环,批量插入数据
- 6.查看集合数据信息 (使用"db.集合名.find()"命令)
- 7.统计集合中的记录("db.集合名.count()"命令)
- 8.指定记录设置别名(“别名=”的方式设置别名)
- 9.查看属性类型
- 10.修改值("db.集合名.update({$set:键:新值})"命令修改)
- 11.删除集合(“db.集合名.drop”)
- 12.删除库("db.集合名.drop()"命令)
- 13.退出数据库(exit命令)
- 14.导出MongoDB中的数据(mongoexport命令)
- 15.导入数据到MongoDB(mongoimport 命令结合--file)
- 16.根据条件导出数据,mongoexport结合-q指定条件
- 17.备份与恢复
- 18.复制数据库
- 19.克隆集合(从其他实例中克隆集合)
- 20.创建管理用户
- 21.进程管理
一、MongoDB 介绍
-
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
-
在高负载的情况下,添加更多的节点,可以保证服务器性能。
-
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
-
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
主要特点
- MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
- 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
- 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
- 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
- Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
- Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
- Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
- GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
- MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
- MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- MongoDB安装简单。
监控功能
-
MongoDB提供了网络和系统监控工具Munin,它作为一个插件应用于MongoDB中。
-
Gangila是MongoDB高性能的系统监视的工具,它作为一个插件应用于MongoDB中。
-
基于图形界面的开源工具 Cacti, 用于查看CPU负载, 网络带宽利用率,它也提供了一个应用于监控 MongoDB 的插件。
MongoDB 应用案例
下面列举一些公司MongoDB的实际应用:
- Craiglist上使用MongoDB的存档数十亿条记录。
- FourSquare,基于位置的社交网站,在Amazon EC2的服务器上使用MongoDB分享数据。
- Shutterfly,以互联网为基础的社会和个人出版服务,使用MongoDB的各种持久性数据存储的要求。
- bit.ly, 一个基于Web的网址缩短服务,使用MongoDB的存储自己的数据。
- spike.com,一个MTV网络的联营公司, spike.com使用MongoDB的。
- Intuit公司,一个为小企业和个人的软件和服务提供商,为小型企业使用MongoDB的跟踪用户的数据。
- sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储。
- etsy.com ,一个购买和出售手工制作物品网站,使用MongoDB。
- 纽约时报,领先的在线新闻门户网站之一,使用MongoDB。
- CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB。
二、安装MongoDB步骤
1.配置yum源
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mkdir backup
[root@localhost yum.repos.d]# mv C* backup/ ##将多余的源仓库放到backup目录下
[root@localhost yum.repos.d]# vi Mongodb.repo ##配置源信息
[mongodb-org]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
[root@localhost yum.repos.d]# yum list ##加载yum源列表
2.yum安装MongoDB
[root@localhost yum.repos.d]# yum install -y mongodb-org
3.配置MongoDB配置文件
[root@localhost ~]# vim /etc/mongod.conf ##只需要将监听地址允许所有访问即可,其余不用修改
systemLog: ##系统日志文件
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log ##日志文件位置
storage: ##存储引擎
dbPath: /var/lib/mongo ##数据存储文件位置
journal:
enabled: true
processManagement: ##进程管理
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid ##PID文件位置
timeZoneInfo: /usr/share/zoneinfo
net: ##网络接口
port: 27017 ##端口号
bindIp: 0.0.0.0 ##绑定的监听IP,修改成任意都能访问
4.启动MongoDB
[root@localhost ~]# systemctl start mongod
[root@localhost ~]# netstat -anpt |grep 27017
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 1210/mongod jin
[root@localhost ~]# mongo
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> exit
bye
5.配置多实例
[root@localhost ~]# cp -p /etc/mongod.conf /etc/mongod2.conf
[root@localhost ~]# vim /etc/mongod2.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/mongod2.log ##修改实例2的日志文件位置
storage:
dbPath: /data/mongodb/mongo ##修改实例2的数据存放目录
journal:
enabled: true
net:
port: 27018 ##修改端口号,与实例一区分开
[root@localhost ~]# mkdir -p /data/mongodb/
[root@localhost ~]# cd /data/mongodb/
[root@localhost mongodb]# mkdir mongo ##创建数据存放目录
[root@localhost mongodb]# touch mongod2.log ##创建日志文件
[root@localhost mongodb]# ls
mongo mongod2.log
[root@localhost mongodb]# chmod 777 mongod2.log ##给予最高权限,权限一定要给,否则服务无法启动
[root@localhost mongodb]# mongod -f /etc/mongod2.conf ##启动实例2
about to fork child process, waiting until server is ready for connections.
forked process: 2226
child process started successfully, parent exiting
[root@localhost mongodb]# netstat -anpt |grep 27017
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 2335/mongod
[root@localhost mongodb]# netstat -anpt |grep 27018
tcp 0 0 0.0.0.0:27018 0.0.0.0:* LISTEN 2226/mongod
6.进入实例2验证
[root@localhost mongodb]# mongo --port 27018 ##进入实例2
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> db.version() ##查看版本
3.6.20
> exit
bye
三、MongoDB数据库基本操作
1.进入MongoDB中的库(use命令)
注意:在MySQL中,创建表需要先建立库,而在MongoDB中,不需要创建库,直接就可以进入库。但是必须在库中建立集合(相当于表),该库才会真正存在,否则空库不会被创建。
[root@localhost ~]# mongo --port 27018
> use school ##进入school库
switched to db school
> show dbs ##查看所有库(school并没有被真正创建,只是在一个缓存空间中被使用)
admin 0.000GB
config 0.000GB
local 0.000GB
2.创建集合 (db.createCollection命令创建)
> db.createCollection('info') ##创建info集合
{ "ok" : 1 }
> show dbs ##再次查看库,此时school库在真正创建了
admin 0.000GB
config 0.000GB
local 0.000GB
school 0.000GB
>
3.查看所有集合(show collections命令)
> use school ##进入库
switched to db school
> show collections ##查看集合
info
4.插入数据("db.集合名.insert({“键名1”:值1,“键2”:值2,…})"命令)
> db.info.insert({"id":1,"name":"zhangsan","score":78,"hobby":["sport","game"]})
WriteResult({ "nInserted" : 1 }) ##一条数据插入成功
//MongoDB支持给键赋值数组,以[]的形式(常规数组中的值必须是同类型的,但是在MongoDB中,数组内的值类型可以不一致,可以有整形也可以有字符串)
5.利用for循环,批量插入数据
> for(var i=2;i<=50;i++)db.info.insert({"id":i,"name":"test"+i})
WriteResult({ "nInserted" : 1 })
6.查看集合数据信息 (使用"db.集合名.find()"命令)
> db.info.find()
{ "_id" : ObjectId("5fa66e2b2f7e809adf86d554"), "id" : 1, "name" : "zhangsan", "score" : 78, "hobby" : [ "sport", "game" ] }
{ "_id" : ObjectId("5fa6881bbdb71a8082419ce2"), "id" : 2, "name" : "test2" }
{ "_id" : ObjectId("5fa6881bbdb71a8082419ce3"), "id" : 3, "name" : "test3" }
{ "_id" : ObjectId("5fa6881bbdb71a8082419ce4"), "id" : 4, "name" : "test4" }
{ "_id" : ObjectId("5fa6881bbdb71a8082419ce5"), "id" : 5, "name" : "test5" }
{ "_id" : ObjectId("5fa6881bbdb71a8082419ce6"), "id" : 6, "name" : "test6" }
{ "_id" : ObjectId("5fa6881bbdb71a8082419ce7"), "id" : 7, "name" : "test7" }
{ "_id" : ObjectId("5fa6881bbdb71a8082419ce8"), "id" : 8, "name" : "test8" }
……//“_id”是数据库分配的id,值是密文//
> db.info.find({"id":30}) ##()内结合{}可以进行精确查找
{ "_id" : ObjectId("5fa6881bbdb71a8082419cfe"), "id" : 30, "name" : "test30" }
> db.info.findOne({"name":"test5"}) ##同样是精确查找
{ "_id" : ObjectId("5fa6881bbdb71a8082419ce5"), "id" : 5, "name" : "test5" }
7.统计集合中的记录("db.集合名.count()"命令)
> db.info.count()
50
8.指定记录设置别名(“别名=”的方式设置别名)
> a=db.info.find({"id":10})
{ "_id" : ObjectId("5fa6881bbdb71a8082419cea"), "id" : 10, "name" : "test10" }
9.查看属性类型
> typeof(10)
number ##数字类型
> typeof("abc")
string ##字符串类型
10.修改值("db.集合名.update({$set:键:新值})"命令修改)
> db.info.find({"id":10}) ##查看info集合数据
{ "_id" : ObjectId("5fa693f7767390befaef3f9b"), "id" : 10, "name" : "test10" }
> db.info.update({"id":10},{$set:{"name":"ZHANGSAN"}}) ##修改更新数据
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.info.find({"id":10}) ##再次查看
{ "_id" : ObjectId("5fa693f7767390befaef3f9b"), "id" : 10, "name" : "ZHANGSAN" }
11.删除集合(“db.集合名.drop”)
> db.info.drop()
true
12.删除库("db.集合名.drop()"命令)
>use school ##进入school库
>db.dropDatabase() ##删除school库
ture
13.退出数据库(exit命令)
> exit
bye
14.导出MongoDB中的数据(mongoexport命令)
[root@localhost ~]# mongo
> use school
switched to db school
> for(var i=2;i<=50;i++)db.info.insert({"id":i,"name":"test"+i})
WriteResult({ "nInserted" : 1 })
> exit
bye
[root@localhost ~]# mongoexport -d school -c info -o /opt/school.json ##注意,导出的文件必须死.json格式,否则无法将数据导回去
2020-11-07T22:03:13.007+0800 connected to: localhost
2020-11-07T22:03:13.008+0800 exported 49 records
mongoexport命令参数含义如下
-d :指定数据库
-c :指定集合
-o :输出到文件中
#############################################
[root@localhost ~]# cd /opt
[root@localhost opt]# ls ##查看输出的文件
rh school.json
[root@localhost opt]# vi school.json ##可以查看到MongoDB集合中的信息
{"_id":{"$oid":"5fa6a8ef8d1138e3f30deb8b"},"id":2.0,"name":"test2"}
{"_id":{"$oid":"5fa6a8ef8d1138e3f30deb8c"},"id":3.0,"name":"test3"}
{"_id":{"$oid":"5fa6a8ef8d1138e3f30deb8d"},"id":4.0,"name":"test4"}
{"_id":{"$oid":"5fa6a8ef8d1138e3f30deb8e"},"id":5.0,"name":"test5"}
{"_id":{"$oid":"5fa6a8ef8d1138e3f30deb8f"},"id":6.0,"name":"test6"}
……省略部分
15.导入数据到MongoDB(mongoimport 命令结合–file)
[root@localhost opt]# mongoimport -d sco -c stu --file school.json ##注意,文件必须是.json格式,导入数据可以自动创建新库新集合
2020-11-07T22:14:39.490+0800 connected to: localhost
2020-11-07T22:14:39.509+0800 imported 49 documents
[root@localhost ~]# mongo
> show dbs ##查看所有库
admin 0.000GB
config 0.000GB
local 0.000GB
school 0.000GB
sco 0.000GB
> use sco ## 使用sco库
switched to db sco
> show collections ##查看所有集合
stu
> db.stu.find() ##查看stu集合中的数据
{ "_id" : ObjectId("5fa6a8ef8d1138e3f30deb8b"), "id" : 2, "name" : "test2" }
{ "_id" : ObjectId("5fa6a8ef8d1138e3f30deb8c"), "id" : 3, "name" : "test3" }
{ "_id" : ObjectId("5fa6a8ef8d1138e3f30deb8d"), "id" : 4, "name" : "test4" }
……省略部分
16.根据条件导出数据,mongoexport结合-q指定条件
[root@localhost opt]# mongoexport -d school -c info -q '{"id":{"$eq":10}}' -o /opt/list.json
2020-11-07T22:35:42.703+0800 connected to: localhost
2020-11-07T22:35:42.703+0800 exported 1 record
[root@localhost opt]# ls
list.json rh school.json
[root@localhost opt]# vim list.json ##导出来一条符合条件的数据
{"_id":{"$oid":"5fa6a8ef8d1138e3f30deb93"},"id":10.0,"name":"test10"}
17.备份与恢复
(1)备份库
[root@localhost opt]# mkdir /backup
[root@localhost opt]# mongodump -d school -o /backup/
2020-11-07T23:07:57.457+0800 writing school.info to
2020-11-07T23:07:57.457+0800 done dumping school.info (49 documents)
[root@localhost opt]# cd /backup/
[root@localhost backup]# ls
school
[root@localhost backup]# ls school/ ##里面有json文件
info.bson info.metadata.json
(2)模拟故障,删除school库
[root@localhost ~]# mongo
> use school
switched to db school
> db.dropDatabase()
{ "dropped" : "school", "ok" : 1 }
(3)恢复库
[root@localhost ~]# mongorestore -d school --dir=/backup/school ##还原数据(库不一定必须是原来的库名,可以重新指定)
2020-11-07T23:16:28.647+0800 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
2020-11-07T23:16:28.648+0800 building a list of collections to restore from /backup/school dir
2020-11-07T23:16:28.648+0800 reading metadata for school.info from /backup/school/info.metadata.json
2020-11-07T23:16:28.653+0800 restoring school.info from /backup/school/info.bson
2020-11-07T23:16:28.655+0800 no indexes to restore
2020-11-07T23:16:28.655+0800 finished restoring school.info (49 documents)
2020-11-07T23:16:28.655+0800 done
> show dbs
……省略部分
school 0.000GB
sco 0.000GB
> use school
switched to db school
> db.info.find()
{ "_id" : ObjectId("5fa6a8ef8d1138e3f30deb8b"), "id" : 2, "name" : "test2" }
{ "_id" : ObjectId("5fa6a8ef8d1138e3f30deb8c"), "id" : 3, "name" : "test3" }
{ "_id" : ObjectId("5fa6a8ef8d1138e3f30deb8d"), "id" : 4, "name" : "test4" }
{ "_id" : ObjectId("5fa6a8ef8d1138e3f30deb8e"), "id" : 5, "name" : "test5" }
……省略部分
18.复制数据库
[root@localhost ~]# mongo
> db.copyDatabase("school","school-bak") ##复制school库数据到school-bak库
{ "ok" : 1 }
> use school-bak ##进入school-bak 备份库
switched to db school-bak
> show collections ##查看集合,无误
info
19.克隆集合(从其他实例中克隆集合)
[root@localhost ~]# mongo -port 27018 ##进入实例2
> show dbs ##查看库,现在只有两个库
admin 0.000GB
local 0.000GB
> db.runCommand ({"cloneCollection":"school.info","from":"192.168.10.10:27017"}) ##从192.168.10.10:27017那里school库中克隆info集合
{ "ok" : 1 }
> show dbs ##再次查看,多出了school库
admin 0.000GB
local 0.000GB
school 0.000GB
> use school ##进入school库
switched to db school
> show collections ## 看看集合
info
> db.info.find() ##查看数据,数据完整
{ "_id" : ObjectId("5fa6a8ef8d1138e3f30deb8b"), "id" : 2, "name" : "test2" }
{ "_id" : ObjectId("5fa6a8ef8d1138e3f30deb8c"), "id" : 3, "name" : "test3" }
……省略部分
20.创建管理用户
> use admin ##管理用户默认存放在admin库中
switched to db admin
> db.createUser({"user":"root","pwd":"123456","roles":["root"]}) ##创建管理用户
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
> db.auth("root","123456") ##使用密码认证,正确返回值为1(前提是配置文件中药开启验证功能,否则无意义)
1
> db.auth("root","1234") ##密码错误会返回值0
Error: Authentication failed.
0
21.进程管理
> db.currentOp() ##可以查看当前进程(显示信息中的opid记录)
{
"inprog" : [
……省略部分
"opid" : 32186, ##主要关注的就是这个PID号进程
……省略部分
}
> db.killOp(32186) ##这条命令可以关闭进程,()中填刚刚查询到的opid号。注意,这并不是关闭数据库,只是关闭当前进程,关闭后还会生成新的进程的,针对当前处理量过大时采用的应急措施,相当于清空垃圾进程。
{ "info" : "attempting to kill op", "ok" : 1 }