MongoDB数据库介绍
1、MongoDB简介
MongoDB官网:https://www.mongodb.com
- MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
- MongoDB 可在高负载的情况下,添加更多的节点,可以保证服务器性能。
- MongoDB 可为Web应用提供可扩展的高性能数据存储解决方案。
- MongoDB 将数据存储在灵活的json文档中,这意味着可以直接得到从文档到文档的数据、结构等。
- MongoDB 是免费使用的(MongoDB分 社区版 [在所有环境下都免费] 和 企业版[在开发环境免费,生产环境收费] 两个版本)。
- MongoDB 数据库具有可伸缩性和灵活性,可帮助你快速查询和索引你需要数据。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
它是可扩展的高性能数据存储解决方案,经常被用于非关系型数据的存储,能存储海量的数据。
常见的非关系型数据库还有:Redis,但 MongoDb 比 redis 更具有数据库的特性。
-
关系型数据库有:MySQL、Oracle、SQL Serve.....
-
非关系型数据库有:Redis、MongoDB...
对比
传统的关系型数据库(如 MySQL)存储数据使用的是一种“行/列模型”。而 MongoDB 是一种“文档数据库”,它将数据存储在类似 JSON 的文档中。
以 JSON 文档的方式存储数据,其中的好处有很多。比如,支持使用数组和对象作为值、文档间可以嵌套、查询的本身就是一个 JSON 等。
2、基本数据结构
与 MySQL 等关系型数据库一样,MongoDb 也有类似的概念,但是其称呼不同。下表列出了 MongoDb 的基本数据结构以及与 MySQL 的对比。
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDb不支持 | |
primary key | primary key | 主键,MongoDb自动将_id字段设置为主键 |
3、基本数据类型
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。(如果不指定的话,mongodb默认会给一个 _id) |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式 |
MongoDB下载与安装
1、Win10安装
官网下载 地址:https://www.mongodb.com/try/download/community
其他下载方式:除了上面的下载方式以外,也可以试试下面的下载链接!
MongoDB Windows系统64位下载地址:http://www.mongodb.org/dl/win32/x86_64
MongoDB Windows系统32位下载地址:http://www.mongodb.org/dl/win32/i386
MongoDB 全部版本下载地址:http://www.mongodb.org/dl/win32
1、下载指定版本
- MongoDB Enterprise Server:企业版(收费版)
- MongoDB Community Server:社区版(免费版)(我们下载社区版本)
- 下载完成后,获得安装包:
mongodb-windows-x86_64-4.4.2-signed.msi
,双击即可安装。
2、选择安装方式:
- 如果已经安装过该版本的MongoDB,会是这个界面(如果没有安装过忽略此步骤)
-
选择Complete,表示安装到默认路径(不推荐,C盘懂的都懂)
-
选择Custom,表示自定义安装路径(推荐)
3、选择安装路径:
注意:MongoDB 3.x 系列版本的数据库,在安装成功后,每次在使用前都需要手动启动MongoDB服务!
现在:MongoDB 4.x 系列版本的数据库,在安装时默认安装(选中了 Install MongoD as a Service)服务 ,就是在开机时自动启动 MongoDB 服务,然后就可以直接使用啦!
4、然后就一直下一步、Next 直到 Flnish 安装完毕,到此就MongoDB就安装结束啦!
5、检查是否安装成功(Windows环境下)
- 方式一:
1、运行 Win + R
2、输入 services.msc 命令便可以查看到 MongoDB Server (MongoDB) 服务啦!!
- 方式二:
1、打开任意浏览器输入:http://127.0.0.1:27017/
2、返回如下信息代表安装成功:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
- 方式三:
C:Userslenovo>mongod -version
db version v4.4.2
Build Info: {
"version": "4.4.2",
"gitVersion": "15e73dc5738d2278b688f8929aee605fe4279b0e",
"modules": [],
"allocator": "tcmalloc",
"environment": {
"distmod": "windows",
"distarch": "x86_64",
"target_arch": "x86_64"
}
}
6、目录文件说明:
默认配置文件:bin/mongod.cfg
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: D:EnvironmentMongoDBServer4.4data # 数据存储目录
journal:
enabled: true
# where to write logging data.
systemLog:
destination: file
logAppend: true # 日志采用追加模式
path: D:EnvironmentMongoDBServer4.4logmongod.log # 日志文件地址
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1 # 数据库端口号
# 开启数据库访问权限验证(注意:换行、缩进格式哦!!)
security:
authorization: enabled
7、配置环境变量(选配,看个人喜好,为了使用方便我配置了)
配置完毕后就是在电脑中任何地方都可以合用mongo、mongod等命令
8、mongod.exe 和 mongo.exe 命令
一定要以管理员身份启动CMD!一定要以管理员身份启动CMD!一定要以管理员身份启动CMD!
这两个命令的作用分别是:
- mongod 启动 MongoDB 服务器。
- mongo 在启动服务器后,帮助我们连接到 MongoDB 实例,也就是进入 Mongo shell(相当于让我们进入后台操作数据库)。
mongod
命令启动参数:
参数 | 描述 |
---|---|
--config或-f | 指定配置文件路径 |
--bind_ip | 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP(0.0.0.0) |
--dbpath | 指定数据库路径 |
--logpath | 定MongoDB日志文件,注意是指定文件不是目录 |
--logappend | 使用追加的方式写日志 |
--port | 指定服务端口号,默认端口27017 |
--serviceName | 指定服务名称 |
--serviceDisplayName | 指定服务名称,有多个mongodb服务时执行。 |
--install | 指定作为一个Windows服务安装。 |
--remove | 移除MongoDB服务 |
--auth | 表示加载认证功能 |
mongod
命令安装示例:
######################## MongoDB方式创建win服务:########################
# 安装 MongoDB 服务,指定配置文件安装(没有指定服务名的话默认服务名为:MongoDB)
mongod --config "D:EnvironmentMongoDBServer4.4inmongod.cfg" --install
# 或者
mongod --bind_ip 0.0.0.0 --dbpath "D:EnvironmentMongoDBServer4.4datadb" --logpath "D:EnvironmentMongoDBServer4.4logmongod.log" --logappend --port 27017 --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install
# 启动和关闭 MongoDB 服务,该名称位--serviceName设置的名称
net start MongoDB
net stop MongoDB
# 移除 MongoDB 服务,必须先关闭 MongoDB 服务
mongod --remove
######################## windows自带创建win服务方式:########################
# 创建 MongoDB 服务(中间几个引号很关键)
sc.exe create MongoDB binPath= ""D:EnvironmentMongoDBinmongod.exe" --service --config= "E:EnvironmentMongoDBmongo.config"" DisplayName= "MongoDB" start= "auto"
# 删除 MongoDB 服务
sc delete MongoDB
mongo
命令:进入 MongoDB Shell界面(登录)
# 1、mongo # 直接进入
# 2、mongo 127.0.0.1:27017/config # 连接到任何数据库config
# 3、mongo --nodb #不连接到任何数据库
# 4、启动之后,在需要时运行new Mongo(hostname)命令就可以连接到想要的mongod了:
> conn=new Mongo('127.0.0.1:27017')
connection to 127.0.0.1:27017
> db=conn.getDB('admin')
admin
# 4、help查看帮助
# mongo -u admin -p password # 连接本地数据库,使用了--auth启动,输入账号密码
# 连接运程MongoDB数据库:(必须指定 绑定IP 和 端口号)
# 格式:mongo 绑定IP:端口号/数据库名 -u 用户名 -p 密码
mongo 127.0.0.1:27017/test -u admin -p password
或者
mongo --host 127.0.0.1 --port 27017
# 也可以登录shell后输入用户名和密码登录
db.auth("admin", "password")
2、Linux安装
MongoDB官网下载地址:https://www.mongodb.com/try/download/community
1、安装步骤:
# 1.切换opt目录
$ cd /opt/
# 2.wget下载安装包
$ wget -P /opt/ https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-4.4.2.tgz
# 3.解压
$ tar -xzvf /opt/mongodb-linux-x86_64-amazon-4.4.2.tgz
# 4.移动目录并且重命名
$ mv /opt/mongodb-linux-x86_64-amazon-4.4.2 /usr/local/mongodb
# 5.新建data和logs目录
$ mkdir -p /usr/local/mongodb/{data,logs}
# 6.授权目录
$ chmod 777 /usr/local/mongodb/{data,logs}
# 7.profile配置文件中增加环境变量,然后刷新配置
$ echo "export PATH=$PATH:/usr/local/mongodb/bin" >> /etc/profile && source /etc/profile
2、启动MongoDB服务
MongoDB 的启动方式分为两种:前置启动、后置启动
无论哪种启动方式都需要执行 bin 目录中的 mongod 命令。MongoDB 在启动时默认的查找数据库的路径为/data/db。如果我们数据库路径有变化,需要在该命令中通过--dbpath 参数来指定 db 目录的路径(该路径可以是绝对路径,也可是相对路径)
2.1、前置启动(配置参数)
# data 目录需要提前创建
mongod --dbpath /usr/local/mongodb/data
2.2、后置启动(配置参数)
所谓后置启动就是以守护进程的方式启动 MongoDB。
我们需要在执行 mongod 命令中添加 --fork 参数。需要注意的是,--fork 参数需要配合着--logpath 或者是--syslog 参数使用。--logpath 与--syslog 参数是指定 MongoDB 的日志文件。MongoDB 的日志文件可以在系统中*的任意位置,本文章中我们在 mongodb 目录下创建 log 目录,在该目录中创建一个名为mongodb.log 的日志文件。
# data和logs目录需要提交创建,mongodb.log文件可不创建。--fork后台启动
mongod --dbpath /usr/local/mongodb/data --logpath /usr/local/mongodb/logs/mongodb.log --fork
2.3、配置文件方式启动
如果觉得在启动 MongoDB 时给定的参数项太多,那么我们也可以通过配置文件来配置启动参数,配置文件可以在任意目录中,配置文件的扩展名应为.conf,配置文件中使用key=value 结构。在执行 MongoDB 时通过--config 参数来指定需要加载的配置文件。我们在 /bin 目录中创建一个名为 mongodb.conf 配置文件
# 1.创建配置文件 mongodb.conf
$ sudo tee /usr/local/mongodb/bin/mongodb.conf <<-'EOF'
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/logs/mongodb.log
port=27017
fork=true
bind_ip=0.0.0.0
#auth=true
EOF
# 1.或vim 编辑
$ vim /usr/local/mongodb/bin/mongodb.conf
# 增加如下配置
dbpath=/usr/local/mongodb/data # 指定 db 路径
logpath=/usr/local/mongodb/logs/mongodb.log # 指定日志文件
logappend=true # 使用追加的方式写日志
port=27017 # 配置端口
fork=true # 配置后端启动
bind_ip=0.0.0.0 # 设置所有ip都可以访问
journal=true # 每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
directoryperdb=true
quiet=true
bind_ip_all=true
auth=true # 启动验证
#noauth=true # 不启用验证
# 2.通过加载配置文件启动MongoDB
$ mongod -f /usr/local/mongodb/bin/mongodb.conf
$ mongod --config /usr/local/mongodb/bin/mongodb.conf
3、关闭MongoDB
-
Ctrl+C关闭(安全关闭):前置启动的话可以直接使用快捷键 Ctrl+C 就可以关闭 MongoDB
-
kill命令关闭(非安全关闭):kill -9 PID、kill -2 PID、kill -4 PID
-
MongoDB函数关闭(安全关闭,要在admin库执行):
db.shutdownServer()
、db.runCommand("shutdown")
-
mongod 命令关闭(安全关闭):./mongod --shutdown --dbpath<数据库路径>
示例:
## 方式一
> use admin
switched to db admin
> db.shutdownServer()
server should be down...
>
## 方式二
$ mongod --shutdown --dbpath /usr/local/mongodb/data/db
3、Docker安装
docker 安装
# 1.下载MongoDB Docker镜像
$ docker pull mongo:4.4.2
$ docker pull mongo:latest
# 2.启动MongoDB服务
$ docker run -itd -p 27017:27017 --name mongodb mongo:latest
$ docker run -itd -p 27017:27017 --name mongodb
-v /mydata/mongo/db:/data/db
mongo:latest
# 3.启动MongoDB服务并设置账号
$ docker run -itd -p 27017:27017 --name mongodb mongo:latest --auth
$ docker run -itd -p 27017:27017 --name mongodb
-v /mydata/mongo/db:/data/db
mongo:latest --auth
# 4.进入容器中的MongoDB客户端
$ docker exec -it mongodb mongo
# 5.在admin数据库中创建超级管理员账号
> use admin
> db.createUser({
user: 'admin',
pwd: 'password',
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
});
>
# 6.创建完成后验证是否可以登录
> db.auth("admin","password")
docker-compose 安装
- docker-compose.yml
version: '3'
services:
mongodb:
image: mongo:4.4.2 # 镜像:版本
container_name: mongo_db # 容器名
environment:
- MONGO_INITDB_ROOT_USERNAME=admin # root管理员账户
- MONGO_INITDB_ROOT_PASSWORD=password # root管理员密码
- MONGO_INITDB_DATABASE=admin # 默认的数据库
volumes:
- ./mongo/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
- ./mongo/mongo-volume:/data/db
ports:
- "27017-27019:27017-27019"
restart: always
- init-mongo.js
// db.getSiblingDB() 相当于 use admin;
db.getSiblingDB('admin').createUser({
user: 'user',
pwd: 'user',
roles: ['readWrite']
});
- 执行启动命令即可
docker-compose up -d
参考:http://www.apgblogs.com/docker-mongodb/#4mongoDb
账户及权限管理
注意:安装好MongoDB数据库后,默认是【非授权模式】(也就是不需要任何权限验证、不需要验证账户,直接输入 mongo 命令就可以进行相关操作)
所以:为了数据的安全,我们都应该去配置数据库的访问权限 和 修改默认(mongodb://127.0.0.1:27017)连接绑定IP 和 端口号!
MongoDB是基于角色的访问控制,所以创建用户需要指定用户的角色,在创建用户之前需要满足:
- 先在admin数据库中创建角色为 userAdmin 或 userAdminAnyDatabase 的用户作为管理用户的用户
- 启用访问控制,进行登录用户验证,这样创建用户才有意义
0、用户角色介绍
数据库角色分类(Built-In Roles—内置角色):
- 数据库用户角色:read、readWrite
- 数据库管理角色:dbAdmin、dbOwner、userAdmin
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
- 备份恢复角色:backup、restore
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
- 内部角色:__system
- 这几个角色直接或间接提供系统超级用户的访问权限:dbOwner 、userAdmin、userAdminAnyDatabase
各角色说明:
-
read:允许用户读取指定数据库
-
readWrite:允许用户读写指定数据库
-
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile
-
userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户
-
clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
-
readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限
-
readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限
-
userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
-
dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限
-
root:只在 admin 数据库中可用。超级账号,超级权限
-
MongoDB数据库中的内置角色:
(1)、【数据库用户角色】针对每一个数据库进行控制。
read:提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces
readWrite:包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.
(2)、【数据库管理角色】每一个数据库包含了下面的数据库管理角色。
dbOwner:该数据库的所有者,具有该数据库的全部权限。
dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。(参考:http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin)
userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。
(3)、【集群管理权限】admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。
clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。
clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能)
clusterMonitor:仅仅监控集群和复制集。
hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。
备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。
(4)、【所有数据库角色】
admin:数据库提供了一个mongod实例中所有数据库的权限角色:
readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。
readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。
userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
(5)、【超级管理员权限】
root: dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。
(6)、【备份恢复角色】
backup:数据库备份
restore:数据库恢复
(7)、【内部角色】
__system
1、创建管理员用户
启用访问控制登录之前,首先需要在admin数据库中创建角色为userAdmin或userAdminAnyDatabase作为用户管理的用户,之后才能通过这个用户创建其它角色的用户,这个用户作为其它所有用户的管理者。
> # 1.切换admin数据库
> use admin
> # 2.添加管理员用户:user/pwd 分别代表用户名和密码,role 代表角色,db 代表要设置的数据库。
> db.createUser({user:"admin", pwd:"password", roles:[{role: "userAdminAnyDatabase", db: "admin" }]})
> db.createUser({
user: "admin",
pwd: "password",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
}
)
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
2、开启授权访问控制
要开启访问控制,则需要在mongod进程启动时加上选项--auth
或在启动配置文件加入选项auth=true
,并重启mongodb实例。
Windows 环境下
方式一:配置文件方式启动
MongoDB数据库的相关配置信息,是存储在mongodb安装目录bin目录中的mongod.cfg文件中,
- 找到
mongod.cfg
文件,然后增加如下配置:
# 开启数据库访问权限验证(注意:换行、缩进格式哦!!)
security:
authorization: enabled
- 然后重新启动MongoDB服务.
方式二:启动时添加授权参数(以管理员身份启动CMD)
# 先关闭MongoDB服务,然后移除,最后重新安装MongoDB服务,带上--auth参数
net stop MongoDB
mongod --remove
mongod --config "D:EnvironmentMongoDBServer4.4inmongod.cfg" --install --auth
net start MongoDB
Linux 环境下
方式一:配置文件方式启动
# 1.mongod配置文件追加如下配置:
$ echo "auth=true" >> /usr/local/mongodb/bin/mongodb.conf
# 2.启动mongodb实例
$ mongod --conf mongodb.cnf
# 3.使用mongo shell登录mongodb实例:
$ mongo 127.0.0.1:27017
MongoDB shell version v4.0.9
connecting to: mongodb://192.168.58.2:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("428c215c-2927-49ee-8507-573efc4a1185") }
MongoDB server version: 4.0.9
>
# 如果没有开启访问控制,则在登录时会提示如下警告信息
** WARNING: Access control is not enabled for the database.
** Read and write access to data and configuration is unrestricted.
方式二:启动时添加授权参数
# 前台启动
mongod --dbpath /usr/local/mongodb/data --auth
# 后台启动
mongod --dbpath /usr/local/mongodb/data --logpath /usr/local/mongodb/logs/mongodb.log --fork --auth
3、用户认证登陆
注:重新启动mongodb服务后,用一个新的命令窗口来做操作,在配置账户权限后,直接在命令窗口中用 mongo 命令,运行相关的操作是没有响应的,只有在正确的输入账户和密码后才进行相关操作!!
可以在使用mongo shell登录时添加选项--authenticationDatabase
或登录完后在admin数据库下进行验证。
- 在mongo shell登录时同时进行验证:
$ mongo 127.0.0.1:27017 -uuser_admin -p --authenticationDatabase admin
MongoDB shell version v4.0.9
Enter password: # 输入密码admin
connecting to: mongodb://192.168.58.2:27017/test?authSource=admin&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("94663b8d-7d88-4c97-ad1c-c3c24262ad39") }
MongoDB server version: 4.0.9
>
- mongo shell 登录完成之后进行验证:
$ mongo 127.0.0.1:27017
MongoDB shell version v4.0.9
connecting to: mongodb://192.168.58.2:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("531e75df-3a5d-4f35-9e18-d7a6e090df63") }
MongoDB server version: 4.0.9
> use admin
switched to db admin
> # 登录认证,返回1,代表登录成功
> db.auth('user_admin','admin')
1
- 连接本地MongoDB数据库(不指定IP 和端口号):
mongo -u admin -p password
- 连接远程MongoDB数据库(指定IP 和 端口号):
- 不指定数据库名(没有输入账号登录):
mongo --host 127.0.0.1 --port 27017
- 不指定数据库名(输入账号登录):
mongo --host 127.0.0.1 --port 27017 -u admin -p password
- 指定登录数据库(输入账号登录):
mongo 127.0.0.1:27017/admin -u admin -p password
- 不指定数据库名(没有输入账号登录):
4、创建普通用户
注:各个不同的数据库之间,可以创建有一个 或 多个账户,各数据库之间账户、密码都是独立的,不能互相访问!
- 使用admin用户在admin数据库中创建基于角色dbOwner的用户test
# 方式一:
# customData 内可以设置任何描述该用户的信息
> use admin
> db.createUser({
user: "test",
pwd: "password",
roles: [{role: "dbOwner", db: "test"}],
customData: {info: "user for dbOwner"}
}
)
# 方式二:
> db.getSiblingDB("admin").runCommand({
createUser: "test",
pwd: "password",
roles: [{role: "dbOwner", db: "test"}],
customData: { info: "user for dbOwner"}
}
)
{ "ok" : 1 }
- 登录test数据库给创建test用户,并且赋予该用户权限
> use test
> db.createUser({
user: "test_admin",
pwd: "password",
roles: [
{role: "read", db: "test"},
{role: "readWrite", db: "test"}]
})
5、查看用户信息
1、查询当前数据库的指定用户:db.getUser(‘用户名’, args)
2、查看当前数据库的所有用户:db.getUsers()、show users
参数说明:
Field | Type | Description |
---|---|---|
showCredentials |
boolean | 可选的。将字段设置为 true 以显示用户的密码哈希。默认情况下,此字段为false 。 |
showPrivileges |
boolean | 可选的。将字段设置为 true 以显示用户的完整特权集,包括继承角色的扩展信息。默认情况下,此字段为false 。如果查看所有用户,则不能指定此字段。 |
showAuthenticationRestrictions |
boolean | 可选的。将字段设置为 true 以显示用户的身份验证限制。默认情况下,此字段为false 。如果查看所有用户,则不能指定此字段。 |
- 查询指定用户
# 方式一:
> use admin
> db.getUser("admin", { showPrivileges: true })
# 方式二:
> db.getSiblingDB("admin").runCommand({
usersInfo: "admin",
showPrivileges: true
}
)
- 查询所有用户:
> show users
{
"_id" : "admin.admin",
"userId" : UUID("f4000321-33d7-43bd-b791-a42294c4a004"),
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
{
"_id" : "admin.test",
"userId" : UUID("c6788e01-a812-4bb8-8d57-0553731e27c4"),
"user" : "test",
"db" : "admin",
"roles" : [
{
"role" : "dbOwner",
"db" : "test"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
6、更新用户信息
updateuser()它是完全替换之前的值:
如果要新增或添加roles而不是代替它 则使用方法: db.grantRolesToUser() 和 db.revokeRolesFromUser()
如果只是更新密码也可以只用此方式:db.changeUserPassword()
更新用户 test 具有 admin 数据库 readWrite 角色为read角色。
> use admin
> db.updateUser("test",{
customData: { info: "user for test" },
roles: [{role: "read", db: "test" }]
})
> use admin
> db.runCommand({
updateUser: "test",
roles: [{ role: "read", db: "test" }],
customData: { info: "user for test" }
})
7、更新用户角色
1、db.grantRolesToUser()
:为用户增加角色
2、db.revokeRolesFromUser()
:为用户回收角色
- 为用户test添加admin数据库的readWrite角色。
# 方式一:
> use admin
> db.grantRolesToUser("test",
[
{role: "readWrite", db: "admin"},
{role: "dbOwner", db: "admin"}
]
)
# 方式二:
> use admin
> db.runCommand({
grantRolesToUser: "test",
roles:
[
{role: "readWrite", db: "admin" },
{role: "dbOwner", db: "admin" }
]
}
)
- 用户dbabd_user回收admin数据库的read角色。
# 方式一:
> use admin
> db.revokeRolesFromUser("test", [{ role: "dbOwner", db: "test"}])
# 方式二:
> use admin
> db.runCommand({
revokeRolesFromUser: "test",
roles:[{ role: "dbOwner", db: "test"}]
})
8、更改用户密码
-
db.updateUser('username',{'pwd':'newpassword'})
。必须有用户管理权限才能使用。这个方式不止可以更新密码。 -
db.changeUserPassword('username','newpassword')
。必须有用户管理全出现才能使用
use admin
db.changeUserPassword("addmin", "admin123")
>
use admin
db.updateUser('addmin',{'pwd':'admin123'})
9、删除用户
use admin
db.dropUser("test")
>
use admin
db.runCommand({ dropUser: "test" })
数据库操作
1、数据库命名规则
MongoDB 数据库的命名要符合 UTF-8 标准的字符串,同时要遵循下表所示的注意事项。
序号 | 注意事项 |
---|---|
1 | 不能是空串 |
2 | 不得含有 /、、?、$、空格、空字符等,基本只能使用 ASCII 中的字母和数字 |
3 | 区分大小写,建议全部小写 |
4 | 名称最多为 64 字节 |
5 | 不得使用保留的数据库名,如:admin、local、config |
注意:数据库最终会成为文件,数据库名就是文件的名称。
- 由于数据库名称在 MongoDB 中不区分大小写,因此数据库名称不能仅仅区别于字符。
- 对于在 Windows 上运行的 MongoDB,数据库名称不能包含以下字符:/、、“、$、*、< >、:、|、? 。
- 对于在 UNIX 和 Linux 系统上运行的 MongoDB,数据库名称不能包含以下字符:/、、。、"、$。
- 虽然 UTF-8 可以提供很多国家的语言的命名格式,在 MongoDB 数据库命名时也可以使用汉字作为数据库名,但是最好尽量采用英文字母、数字、字符等为主的命名格式。
示例:
-
正确的命名格式:myDB、my_NewDB、myDB12
-
错误的命名格式:.myDB、/123
保留数据库:MongoDB 系统保留的数据库如下:
库名 | 作用 |
---|---|
admin | 权限数据库,添加用户到该数据库中,该用户会自动继承数据库的所有权限 |
local | 数据库中的数据永远不会被复制 |
config | 分片时,config 数据库在内部使用,保存分子信息 |
test | 默认数据库,可以用来做各种测试等 |
2、创建切换数据库
创建、打开、切换 数据库:use dbname
use
> use mydb
switched to db mydb
注:
- 如果打开的这个数据库存在就是打开这个数据库。
- 如果打开的是一个不存在的数据库(没有这个数据库名字),那么就会创建一个同名的数据库。
- 创建一个新的数据库时,需要向数据库中创建集合并且插入一条数据,这个数据库才能创建成功!否则show dbs查询不到此数据库
示例:往集合中插入一条数据。可以不用先创建集合,直接往里添加数据即可:
# user 就是集合(表)名
db.user.insert({"name": "xiaoming"})
当命令执行后,数据库系统发现 user 是一个数据集合不存的,就自动创建一个集合,并随着数据的插入,数据库和集合也就真正的创建成功了。
要在不切换当前数据库访问其他的数据库使用 db.getSiblingDB() 方法。
3、查看数据库
- 查看当前所在数据库(默认为test):
db
- 查看所有数据库:
show dbs
- 查看当前数据库相关信息(名称、文档个数、视图、索引、大小等):
db.stats()
> db
test
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>
> db.stats() # 统计数据信息
{
"db" : "test", # 数据库名
"collections" : 0, # 集合数量
"views" : 0,
"objects" : 0, # 文档数量
"avgObjSize" : 0, # 平均每个文档的大小
"dataSize" : 0, # 数据占用空间大小,不包括索引,单位为字节
"storageSize" : 0, # 分配的存储空间
"totalSize" : 0, # 总共空间大小
"indexes" : 0, # 索引个数
"indexSize" : 0, # 索引占用空间大小
"scaleFactor" : 1,
"fileSize" : 0,
"fsUsedSize" : 0,
"fsTotalSize" : 0,
"ok" : 1
}
备注:为什么查询所有数据库时没有看到当前默认的test数据库呢?因为test数据库内没有数据,实际上不算真正意义上的存在。
4、删除数据库
删除当前所在的数据库:db.dropDatabase()
注:删除后集合中的所以文档、以及相关的索引等都会被删除!!
> db.dropDatabase()
{ "ok" : 1 }
6、查看帮助文档
1、数据库帮助命令
-
导入工具所有操作方法:
mongoexport --help
-
导出工具所有操作方法:
mongoimport --help
-
备份工具所有操作方法:
mongodump --help
-
恢复工具所有操作方法:
mongorestore --help
-
列出MongoDB数据库所有的操作方法:
db.help()
-
列出MongoDB文档(表)所有的操作方法:
db.collection.help()
集合操作
1、集合命名规则
MongoDB 的集合就相当于 MySQL 的一个表 table
,集合是一组文档,是无模式的,集合名称要求符合 UTF-8 标准的字符串,同时要遵循下表所示的注意事项。
序号 | 注意事项 |
---|---|
1 | 集合名不能是空串 |
2 | 不能含有空字符 |
3 | 不能以“system.”开头,这是系统集合保留的前缀 |
4 | 集合名不能含保留字符“$” |
对于分别部署在 Windows、Linux、UNIX 系统上的 MongoDB,集合的命名方式与数据库命名方式一致。
2、集合创建
MongoDB 集合的创建有显式和隐式(推荐)两种方法。
2.1、显示创建集合函数:db.createCollection(name, options)
语法格式:db.createCollection(name,options)
name:要创建的集合名称
options:可选参数,指定有关内存大小及索引的选项
- options 可以是如下参数:
参数 | 类型 | 描述 |
---|---|---|
capped | Boolean | (可选)如果为 true,则启用封闭的集合。上限集合是固定大小的集合,它在达到其最大时自动覆盖其最旧的条目。如果指定 true,则还需要指定 size 参数 |
autoindexid | Boolean | (可选)如果为 true,自动在 _id 字段创建索引。默认为false。 |
size | 数字 | (可选)指定上限集合的最大大小(以字节为单位)。如果 capped 为 true,那么还需要指定此字段的值 |
max | 数字 | (可选)指定上限集合中允许的最大文档数 |
- 创建无参数的集合:
db.createCollection('day1')
- 创建带参数的集合:
# 创建名为day2的固定集合,集合空间大小为:2000000kb(大约1.9g),文档最大个数为:1000
db.createCollection('day2',{capped:true,autoIndexId:true,size:2000000,max:1000})
- 示例:
> db.createCollection('day1')
{ "ok" : 1 }
>
> db.createCollection('day2',{capped:true,autoIndexId:true,size:2000000,max:1000})
{
"note" : "The autoIndexId option is deprecated and will be removed in a future release",
"ok" : 1
}
> show collections
day1
day2
students
>
2.2、隐式创建集合(推荐):
当插入文档时,如果集合不存在,则 MongoDB会隐式地自动创建集合:
db.myDB.insert({"name": "tom"})
3、集合查询
MySQL 列出的所有表都可以使用 show tables。MongoDB 列出所有集合可以使用如下两种方式:
-
show tables
-
show collections
-
db.getCollectionNames()
> db
test
> show tables
dept
student
> show collections
dept
student
> db.getCollectionNames()
[ "dept", "student" ]
>
4、集合删除
集合删除(当前集合):db.collection.drop();
> db.day1.drop()
true
5、集合修改
集合重新命名:db.collection.renameCollection();
> db.students.renameCollection("student")
{ "ok" : 1 }
文档操作
1、文档命名规则
文档是 MongoDB 中存储的基本单元,是一组有序的键值对集合。文档中存储的文档键的格式必须是符合 UTF-8 标准的字符串,同时要遵循以下注意事项:
- 不能包含