初识MongoDB数据库——安装及基本操作

一、MongoDB 介绍

  • MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

  • 在高负载的情况下,添加更多的节点,可以保证服务器性能。

  • MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

  • MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

主要特点

  1. MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  2. 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
  3. 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  4. 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  5. Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  6. MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  7. Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  8. Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  9. Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  10. GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  11. MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  12. MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  13. MongoDB安装简单。

监控功能

  • MongoDB提供了网络和系统监控工具Munin,它作为一个插件应用于MongoDB中。

  • Gangila是MongoDB高性能的系统监视的工具,它作为一个插件应用于MongoDB中。

  • 基于图形界面的开源工具 Cacti, 用于查看CPU负载, 网络带宽利用率,它也提供了一个应用于监控 MongoDB 的插件。

MongoDB 应用案例

下面列举一些公司MongoDB的实际应用:

  1. Craiglist上使用MongoDB的存档数十亿条记录。
  2. FourSquare,基于位置的社交网站,在Amazon EC2的服务器上使用MongoDB分享数据。
  3. Shutterfly,以互联网为基础的社会和个人出版服务,使用MongoDB的各种持久性数据存储的要求。
  4. bit.ly, 一个基于Web的网址缩短服务,使用MongoDB的存储自己的数据。
  5. spike.com,一个MTV网络的联营公司, spike.com使用MongoDB的。
  6. Intuit公司,一个为小企业和个人的软件和服务提供商,为小型企业使用MongoDB的跟踪用户的数据。
  7. sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储。
  8. etsy.com ,一个购买和出售手工制作物品网站,使用MongoDB。
  9. 纽约时报,领先的在线新闻门户网站之一,使用MongoDB。
  10. 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 }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值