MongoDB介绍、安装、连接、使用、用户管理

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

发布了114 篇原创文章 · 获赞 851 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Powerful_Fy/article/details/103588231