MongoDB介绍
官网:www.mongodb.com,当前最新版4.2,C++编写,基于分布式的,属于NoSQL的一种,最像关系型数据库的NoSQL,MongoDB 将数据存储为一个文档,数据结构由键值(key-value)对组成,MongoDB文档类似于JSON对象,字段值可以包含其他文档、数组及文档数组。
MongoDB与关系型数据库的对比:
关系型数据库的数据结构:
MongoDB的数据结构:
安装MongoDB
创建repo文件:
[root@linux ~]# cd /etc/yum.repos.d/
[root@linux yum.repos.d]# vim mongodb.repo
添加以下内容:
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
查看可安装的MongoDB包:
[root@linux yum.repos.d]# yum list |grep mongo
mongodb-org.x86_64 4.2.2-1.el7 mongodb-org-4.2
mongodb-org-mongos.x86_64 4.2.2-1.el7 mongodb-org-4.2
mongodb-org-server.x86_64 4.2.2-1.el7 mongodb-org-4.2
mongodb-org-shell.x86_64 4.2.2-1.el7 mongodb-org-4.2
mongodb-org-tools.x86_64 4.2.2-1.el7 mongodb-org-4.2
安装MongoDB:
[root@linux ~]# yum -y install mongodb-org
如果yum安装速度太慢导致安装失败可以到网易开源镜像站下载MongoDB的rpm包
安装MongoDB服务端程序:
[root@linux ~]# wget http://mirrors.163.com/mongodb/yum/el7-4.2/RPMS/mongodb-org-server-4.2.2-1.el7.x86_64.rpm
[root@linux ~]# rpm -ivh mongodb-org-server-4.2.2-1.el7.x86_64.rpm
安装shell包,即可使用命令行连接MongoDB:
[root@linux ~]# wget http://mirrors.163.com/mongodb/yum/el7-4.2/RPMS/mongodb-org-shell-4.2.2-1.el7.x86_64.rpm
[root@linux ~]# rpm -ivh mongodb-org-shell-4.2.2-1.el7.x86_64.rpm
安装tools包,用户数据导入导出:
[root@linux ~]# wget http://mirrors.163.com/mongodb/yum/el7-4.2/RPMS/mongodb-org-tools-4.2.2-1.el7.x86_64.rpm
[root@linux ~]# rpm -ivh mongodb-org-tools-4.2.2-1.el7.x86_64.rpm
安装mongos包,用户部署集群:
[root@linux ~]# wget http://mirrors.163.com/mongodb/yum/el7-4.2/RPMS/mongodb-org-mongos-4.2.2-1.el7.x86_64.rpm
[root@linux ~]# rpm -ivh mongodb-org-mongos-4.2.2-1.el7.x86_64.rpm
查看配置文件:
[root@linux ~]# 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 runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # pid文件路径
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017 #端口
bindIp: 127.0.0.1 # 授权连接的ip,默认只允许从本地连接
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
注意:
1.pid文件路径不要改动,否则可能会导致MongoDB服务启动后导致自动关闭
2.bindip如果要允许从任何地址连接MongoDB,设置为0.0.0.0即可,也可以使用逗号分隔,定义多个允许远程连接的ip
3.如果更改了日志和数据存放路径,数据存放目录和日志文件属主以及属组都要改为mongod
连接MongoDB
启动服务:
[root@linux ~]# systemctl start mongod
连接MongoDB:
[root@linux ~]# mongo
如果修改了默认端口,连接时需要指定端口:
[root@linux ~]# mongo --port 27017
远程连接时,需要指定MongoDB服务端ip:
[root@linux ~]# mongo --host 192.168.234.128
MongoDB用户管理
选择库:
> use admin
switched to db admin
#当选择或切换的库不存在时,会自动创建
创建用户:
> db.createUser( { user: "user1", customData: {description: "superuser"}, pwd: "user1", roles: [ { role: "root", db: "admin" } ] } )
#user:指定用户名,pwd:指定密码,role:指定角色,db:指定库名(表示用户user1有admin库的root角色权限),customData为说明字段,可以省略
列出所有用户:
> db.system.users.find()
{ "_id" : "admin.user1", "userId" : UUID("44bb45e3-d501-4eef-aad2-887e130c964a"), "user" : "user1", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "hvbjZM5of8t7OuNFcTKcdA==", "storedKey" : "9INTkZA44PSbKbMPkn5XHfEG2XY=", "serverKey" : "ZoyxUOtanJYDVddpq30cw+D2qTA=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "+/Y9cCf6va52KNfYR1pHJYFxQjtC82VKWN6VPA==", "storedKey" : "wJVYMGKsUO2FYJMNtFHM9RLcDE+HmdO9xJXbAQxj8r8=", "serverKey" : "VfLGAr/MdyfK8DrNCvTEeETIQ360RUN3uB8b00vjV+M=" } }, "customData" : { "description" : "superuser" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
#需在先切换到admin库下使用
查看当前库下的所有用户:
> show users
{
"_id" : "admin.user1",
"userId" : UUID("44bb45e3-d501-4eef-aad2-887e130c964a"),
"user" : "user1",
"db" : "admin",
"customData" : {
"description" : "superuser"
},
"roles" : [
{
"role" : "root",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
删除用户:
> db.dropUser('user1')
开启登录用户名密码认证:
1.编辑启动脚本:
[root@linux ~]# vim /usr/lib/systemd/system/mongod.service
2.在OPTION=后面加上- -auth:
Environment="OPTIONS=--auth -f /etc/mongod.conf"
3.重启MongoDB服务:
[root@linux ~]# systemctl daemon-reload
[root@linux ~]# systemctl restart mongod
此时还可以用mongo的方式连接MongoDB,但是切换到指定的库时,查看库中的内容会报错:
[root@linux ~]# mongo
> use admin
switched to db admin
> show users
2019-12-18T13:56:44.063+0800 E QUERY [js] uncaught exception: Error: command usersInfo requires authentication :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.getUsers@src/mongo/shell/db.js:1638:15
shellHelper.show@src/mongo/shell/utils.js:883:9
shellHelper@src/mongo/shell/utils.js:790:15
@(shellhelp2):1:1
开启用户名密码认证后登录需要指定用户名,密码,数据库名:
[root@linux ~]# mongo -u user1 -p user1 --authenticationDatabase admin
> use admin
switched to db admin
> show users;
{
"_id" : "admin.user1",
"userId" : UUID("44bb45e3-d501-4eef-aad2-887e130c964a"),
"user" : "user1",
"db" : "admin",
"customData" : {
"description" : "superuser"
},
"roles" : [
{
"role" : "root",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
#由于mongoDB的用户是创建在指定的库中,所以登录时需要使用authenticationDatabase指定用户所在的库进行验证,超级管理员可以不用指定库,登录后默认在test库中,使用use切换到要使用的库即可
补充
1.当用户拥有多个库的角色的情况下:
>use db1
>db.createUser( { user: "test1", pwd: "test1", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } )
该用户test1拥有db1库的读写权限和db2库的读权限,但是登录时,还是要先指定db1库,因为该用户在db1库中创建
2.当使用mongo直接登录,不指定用户,密码的情况下,登录后需要切换到用户所在的库,然后db.auth(“username”,“password”)验证后才能执行相应的操作
3.查看MongoDB版本
> db.version()
4.2.2
4.查看所有库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
#已创建的库如果未显示,需要在库中创建集合后即可显示
5.删除当前所在的库
> use db1
switched to db db1
> db.dropDatabase()
{ "ok" : 1 }
#删除之前必须use切换到要删除的库中
6.查看当前库的信息
> db.stats()
{
"db" : "admin",
"collections" : 2,
"views" : 0,
"objects" : 5,
"avgObjSize" : 349.8,
"dataSize" : 1749,
"storageSize" : 73728,
"numExtents" : 0,
"indexes" : 3,
"indexSize" : 110592,
"scaleFactor" : 1,
"fsUsedSize" : 10129276928,
"fsTotalSize" : 19102957568,
"ok" : 1
}
7.查看MongoDB服务器状态
> db.serverStatus()
MongoDB用户角色:
角色名 | 描述 |
---|---|
Read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
userAdmin | 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 |
clusterAdmin | 只在admin数据库中创建用户可用,赋予用户所有分片和复制集相关函数的管理权限 |
readAnyDatabase | 只在admin数据库中创建用户可用,赋予用户所有数据库的读权限 |
readWriteAnyDatabase | 只在admin数据库中创建用户可用,赋予用户所有数据库的读写权限 |
userAdminAnyDatabase | 只在admin数据库中创建用户可用,赋予用户所有数据库的userAdmin权限 |
dbAdminAnyDatabase | 只在admin数据库中创建用户可用,赋予用户所有数据库的dbAdmin权限 |
root | 只在admin数据库中创建用户可用,超级管理员 |
MongoDB创建集合
创建集合:
语法:db.createCollection(name,options)
name为集合名称,options可选,用来定义集合的配置参数
> use db1
switched to db db1
> db.createCollection("Test", { capped : true, size : 6142800, max : 10000 } )
{ "ok" : 1 }
集合名首字母大写,否则无法向集合中添加或更改数据
capped:true/false (可选)如果为true,则启用封顶集合,封顶集合是固定大小的集合,当它达到其最大大小,会自动覆盖最早的条目,如果指定true,则也需要指定尺寸参数
size:(可选)指定封顶集合的最大大小字节,如果开启了封顶集合,那么还需要指定这个字段,单位Byte
max:(可选)指定封顶集合中允许的文件最大数量
查看库中的集合:
> show collections
Test
> show tables
Test
#两种方式均可
向集合中插入数据:
> db.Abc.insert({id:1,name:"123",password:"123456"})
WriteResult({ "nInserted" : 1 })
#Abc为集合名称,如不存在,会自动创建该集合
更改集合中的数据:
> db.Abc.update({id:1},{"$set":{"age":18}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
更改集合中id为1的文档,将键age的value为18,如该键不存在,则自动创建
查询集合中的所有文档:
> db.Abc.find()
{ "_id" : ObjectId("5df9deec7d7d797e07629490"), "id" : 1, "name" : "123", "password" : "123456", "age" : 18 }
{ "_id" : ObjectId("5df9def97d7d797e07629491"), "id" : 2, "name" : "1673", "password" : "465712" }
根据条件查询:
> db.Abc.find({name:"123"})
{ "_id" : ObjectId("5df9deec7d7d797e07629490"), "id" : 1, "name" : "123", "password" : "123456", "age" : 18 }
根据条件删除:
> db.Abc.remove({id:2})
WriteResult({ "nRemoved" : 1 })
> db.Abc.find()
{ "_id" : ObjectId("5df9deec7d7d797e07629490"), "id" : 1, "name" : "123", "password" : "123456", "age" : 18 }
删除集合:
> db.Abc.drop()
true
查看所有集合的状态:
db.printCollectionStats()
#类似MySQL中的show createtable tbname