一.安装
二.常用命令
1.启动mongo
1.1 命令行启动服务
mongod.exe --bind_ip 127.0.0.1 --logpath D:\MongoDB\dblog\mongodb.log --logappend --dbpath D:\MongoDB\db --port 27017 --service
bind_ip :绑定服务 IP,绑定127.0.0.1,则只能本机访问,不指定默认本地所有 IP ;
logpath :配置日志存放的位置;
logappend :日志使用追加的方式;
dbpath :配置数据存放的位置;
port :配置端口号,27017是默认端口;
service :以服务方式启动,即后台启动。
1.2 配置文件启动服务
创建配置文件mongod.conf
配置文件内容
#以下路径改成自己的
port=27020 #配置端口号
dbpath=/data/db_mydb #配置数据存放的位置
logpath=/logs/ mymongo/mongod.log #配置日志存放的方式
logappend=true #日志使用追加的方式
fork=true #设置在后台运行
启动命令
mongod -f /etc/mongod/mongod.conf
1.3 mongoDB启动多实例
方法和1一样,将目录和端口号改为不同即可
1.4 启动客户端
mongo --port 27017
出现 > 符号即为成功
MongoDB 默认的连接方式无需输入用户名和密码,port 端口根据你服务启动的端口连接
1.5关闭mongoDB服务
当能连接到客户端时
use admin #使用系统数据库admin,只有在admin数据库中才可以进行关闭服务的操作
db.shutdownServer() #关闭服务
如下图所示,则说明服务关闭成功
无法连接客户端时
有时候数据库服务异常关闭时,我们连不上客户端,就可以使用该方法。
查看 Mongo 相关进程 ps -ef | grep mongo
,如图所示:
kill 和 Mongo 的服务进程 kill 26
1.6 关闭客户端
退出客户端的命令很简单,只需在客户端输入 exit 便可顺利退出
2 help
2.1 查看help
查看 MongoDB 支持哪些命令:help
;
查询当前数据库支持的方法:db.help()
;
查询集合支持哪些方法:db.集合名.help()
2.2 官方文档
mongoDB官方文档
https://docs.mongodb.com/manual/
mongoDB中文文档
http://www.mongoing.com/docs/
三.mongo数据库安全
1.管理员用户
1.1创建管理员用户
切换到admin数据库 use admin
(admin数据库是一个具有特殊权限的数据库,用户需要访问它以便执行某些管理命令);在数据库admin中,创建管理员用户abc,密码为123,拥有root权限。
db.createUser({user:"abc",pwd:"123",roles:[{role:"root",db:"admin"}]})
结果如下图说明添加管理员用户成功:
验证管理员用户是否存在:
db.auth("abc","123")
如下图,返回为1说明成功。
1.2 查看用户
进入admin数据库,查看我们创建的用户
use admin
show users
1.3 启用身份验证
启用身份验证是为了保护数据库的安全。
身份验证默认是禁用的,因此要在启动MongoDB数据库服务mongod时使用参数--auth
来启用身份验证(启用身份验证前,确保你至少已有一个管理员用户)。
先关闭现在有的数据库服务
use admin
db.shutdownServer()
运行结果如下:
重新启动mongod服务
在命令行输入(下面代码所使用的路径需要更换成自己的)
mongod --auth --port 27017 --dbpath /data/db --logpath /tmp/mongodb.log --fork
- auth: 开启身份验证;
- dbpath: 指定数据存放路径;
- logpath: 指定日志文件输出路径;
- fork: 后台运行。
1.4 管理员登陆数据库
情况一:在命令行连接数据库(注意选择admin数据库);
mongo -uabc -p123 admin
情况二:在受限的情况下验证身份;
开启身份验证后,我们使用命令mongo直接连接数据库,虽然也能成功连接,但是在进行数据库操作如show dbs时会受到限制:
这是我们就要进入到admin数据库,去进行身份验证
use admin
db.auth("abc","123")
返回数字1说明验证成功,0说明失败。
验证成功后将拥有管理员权限
1.5 删除管理员用户
删除管理员用户abc命令如下:
db.system.users.remove({user:"abc"})
返回1说明删除成功,0说明删除失败。
2 按需求创建普通用户
2.1 权限列表
权限 | 说明 |
---|---|
Read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
userAdmin | 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 |
clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 |
readAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读权限 |
readWriteAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读写权限 |
userAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 |
dbAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 |
root | 只在admin数据库中可用。超级账号,超级权限 |
2.2 使用实例
创建用户:user1
,密码:useu1
,拥有数据库test
的读写权限;
use test
db.createUser({user:"user1",pwd:"user1",roles:[{role:"readWrite",db:"test"}]})
注:该用户只对数据库test
有权限。
查看用户命令:show users
;
创建用户:user2
,密码:user2
,对数据库test2
有读写权限,对数据库test
有只读权限。
use test2
db.createUser({user:"user2",pwd:"user2",roles:[{role:"readWrite",db:"test2"},{role:"read",db:"test"}]})
查看用户命令:show users
;
2.3 删除用户
(要先确定自己有root
权限)删除user2
用户,先进入test2
数据库:
use test2
db.dropUser("user2")
结果返回true
说明删除成功:
思考:不进入目标数据库是否可以删除目标数
3 数据库限制访问
3.1 限制IP访问
限制 IP 访问,需要重启数据库服务 mongod 时,启用相应的功能,步骤如下:
use admin #进入admin数据库
db.shutdownServer() #关闭服务
exit #退出数据库
#启动服务(只有本机 IP 可以连接数据库)
mongod --dbpath /data/db --logpath /tmp/mongodb.log --bind_ip 127.0.0.1 --fork
binf_ip :限制连接的网络接口,可以设置多个,以逗号隔开。
使用其他 IP 访问被限制,如图所示:
3.2限制端口访问
当按照以上方法启动 mongod 时,默认情况下他会等待所有在端口27017上的入站连接,可以用 -port 修改该设置。也需要重新启动 mongod 服务,方法同上。
use admin #进入admin数据库
db.shutdownServer() #关闭服务
exit #退出数据库
#启动服务(只有本机 IP 可以连接数据库,且限制只能端口20000连接)
mongod -port 20000 --dbpath /data/db --logpath /tmp/mongodb.log --bind_ip 127.0.0.1 --fork
连接数据库
mongo 127.0.0.1:20000
设置了端口后如果不加端口连接会被拒绝访问,如图所示
注:在数据库实际的应用中,最好不要使用这些默认设置,对这些设置进行一些修改,让你的数据更加安全。
四.MongoDB的基础操作
1数据库相关
1.1 连接数据库
MongoDB 安装完成后,可以通过 pgrep mongo -l
命令来查看是否已经启动。如图所示:
在操作数据库之前,需要连接它,连接本地数据库服务器,输入命令:
mongo
连接过程中的警告可以不用管,只要最下方出现“ > ”符号,就说明连接成功。
1.2 创建数据库
连接上 MongoDB 之后就可以进行数据库的操作了,接下来我们创建一个名为 Testdb 的数据库,用命令:use Testdb
语句来创建(如果数据库不存在,则创建数据库,否则切换到指定数据库)
db
命令查看当前数据库
show dbs
可以查看所有数据库
当我们查看所有数据库时,并没有我们刚创建的 Testdb 数据库。要想显示它,我们需要向数据库插入一些数据:
db.Testdb.insert({_id:1,name:"王小明"})
插入成功后,就可以看到我们创建的数据库 Testdb 了
1.3 删除数据库
MongoDB 删除数据库需要先切换到该数据库中:
use Testdb
然后再执行删除命令:
db.dropDatabase()
2 集合
2.1 如何在指定的数据库创建集合;
先进入指定数据库 Testdb :use Testdb
;
在 Testdb 数据库中创建创建固定集合 test ,整个集合空间大小512000KB,文档最大个数为1000个。
db.createCollection("test", { capped : true, autoIndexId : true, size : 512000, max : 1000 } )
- capped :是一个布尔类型,true 时创建固定集合,必须指定 size。固定集合指有固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。默认为 false;
- autoIndexId :也是一个布尔类型,如为 true,自动在_id 字段创建索引。默认为 false ;
- size :为固定集合指定一个最大值(以字节 KB 计);
- max :指定固定集合中包含文档的最大数量。
和 MySQL 不同的是,在 MongoDB 中,你不一定需要先创建集合。当你插入一些文档时,MongoDB 会自动创建集合
创建集合命令(推荐):db.集合名.insert()
(注意:一条数据用大括号“ {} ”括起来,多条数据用“ [] ”将所有数据括起来)。
db.mytest2.insert([{"name" : "王小明","sex":"男"},{"name" : "李小红","sex":"女"}])
默认id
MongoDB 中存储的文档 必须 有一个_id
键(如果我们插入数据的时候未指定_id
,系统会自动生成一个默认的 id )。这个键的值可以是任何类型的,默认是个 ObjectId 对象。在一个集合里面,每个文档都有唯一的_id
值,来确保集合里面每个文档都能被唯一标识。如果有两个集合的话,两个集合可以都有一个值为123的_id
键,但是每个集合里面只能有一个_id
是123的文档。
2.2 查看集合
查询集合命令: db.集合名.find()
。由此我们也能看到 MongoDB 默认创建的_id
2.3 删除集合
删除集合命令: db.集合名.drop()
2.4 查询数据库下所有集合
查询所有集合命令: show collections
3基础文档操作
3.1 插入文档
插入文档命令: db.集合名.insert(文档)
该命令我们前面也有用到。除了之前的用法以外,我们还可以将数据定义为一个变量,如下所示:
document=({_id:1,
name: '王小明',
sex: '男',
hobbies: ['乒乓球','羽毛球'],
birthday: '1996-02-14'
});
然后执行插入操作:
db.person.insert(document)
person 是集合名,如果该集合不在该数据库中,MongoDB 会自动创建该集合并插入文档,查看 person 集合,如图所示:
3.2 更新文档
更新文档主要会用到 update() 方法和 save() 方法。
update() 方法
我们先把 document 插入到集合 person2;
db.person2.insert(document)
用 update() 方法来更新 person2 的数据,把王小明的出生日期替换成1996,命令如下:
db.person2.update({birthday:"1996-02-14"},{$set:{birthday:"1996"}})
更新后如图所示( pretty() 方法的作用是使文档整齐的输出):
可以发现:
- update() 有两个参数,都是对象,中间用逗号“ ,”间隔;
- 第一个参数表示需要修改的值的过滤条件;
- 第二个参数用 $set 操作符指向更新后的值。
save() 方法
save() 方法通过传入的文档来替换已有文档。
我们先把 document 插入到集合 person3 中;
db.person3.insert(document)
如果这时我们把一个人的数据都弄错了,怎么办呢?这时用 save() 方法来更新修改一下 person3 的数据就比较方便。
用 save() 方法把王小明的数据修改为李小红的数据:
db.person3.save({
"_id" :1,
"name" : "李小红",
"sex" : "女",
"hobbies" : [
"画画",
"唱歌",
"跳舞"
],
"birthday" : "1996-06-14"
})
注:如果 save()
法也指定了_id
,则对文档进行更新;未指定_id
则会执行插入功能,MongoDB 默认自动生成一个不重复的_id
总结:
- update() 方法仅适用于修改某条数据中的某个键值(一次仅修改最上面的一条);
- save() 方法适用于修改整条数据。
3.3 查询文档
我们先插入文档到集合 stu1 :
document=([{
name:'张小华',
sex:'男',
age:20,
phone:'12356986594',
hobbies:['打篮球','踢足球','唱歌']
},{
name:'李小红',
sex:'女',
age:18,
phone:'12355487536',
hobbies:['跳舞','唱歌']
}])
db.stu1.insert(document)
条件查询
操作 | 格式 | 范例 | 关系数据库中类似的语句 |
---|---|---|---|
等于 | {key:value} | db.stu1.find({“name”:“李小红”}).pretty() | where name = ‘李小红’ |
小于 | {key:{$lt:value}} | db.stu1.find({“age”:{$lt:18}}).pretty() | where age < 18 |
小于或等于 | {key:{$lte:value}} | db.stu1.find({“age”:{$lte:18}}).pretty() | where age <= 18 |
大于 | {key:{$gt:value}} | db.stu1.find({“age”:{$gt:18}}).pretty() | where age > 18 |
大于或等于 | {key:{$gte:value}} | db.stu1.find({“age”:{$gte:18}}).pretty() | where age >= 18 |
不等于 | {key:{$ne:value}} | db.stu1.find({“age”:{$ne:18}}).pretty() | where age != 18 |
现在我们来查找一下 age 大于18岁的数据,命令和效果如图所示:
AND 条件
find() 方法可以传入多个键 (key),每个键 (key) 以逗号隔开,即常规 SQL 的 AND 条件。如查询集合 stu1 中年龄为20岁的男性信息:
db.stu1.find({"age":20, "sex":"男"}).pretty()
查询结果如图所示:
删除文档数据
删除指定的数据:
db.stu1.remove({'age':20}) //删除年龄为20的数据
查看该集合的内容,如果只剩下如图所示的信息,说明数据删除成功
db.remove({})
查看该集合的内容,如果如图所示,无显示或者显示为空,说明数据全部删除:
五.mongoDb的高级操作
1 高级查询
$all 匹配所有
$exists 判断字段是否存在
$mod 取模运算
$in 包含
$nin 不包含
$size 数组元素个数
查询结果排序
$or 条件之间的或查询
$and 条件之间的且查询
$not 条件取反查询
正则表达式匹配查询
count() 返回结果集总数
$all 匹配所有
假设有集合 hobbies 内容如下:
_id | name | sex | hobbies |
---|---|---|---|
1 | 小红 | 女 | 唱歌,跳舞,羽毛球 |
2 | 小明 | 男 | 唱歌,乒乓球,羽毛球 |
3 | 小亮 | 男 | 乒乓球,羽毛球 |
查询其中所有喜欢“唱歌”和“羽毛球”的人:
db.hobbies.find({hobbies:{$all:["唱歌","羽毛球"]})
$all 会查询满足方括号中所有条件的文档,如果只有其中一项满足是不会被查询出来的。
$exists 判断字段是否存在
在集合 hobbies 中更新文档:
db.hobbies.save({_id:1,name:"小红",age:18,sex:"女",hobbies:["唱歌","跳舞","羽毛球"]}) #添加小红年龄18
查询 hobbies 集合中存在 age 字段的文档,如图 所示:
hobbies 集合中不存在 age 字段的文档,如图 3 所示:
$mod 取模运算
在集合 hobbies 中更新文档:
db.hobbies.update({_id:2},{$set:{age:20}}) #添加小明年龄20
db.hobbies.update({_id:3},{$set:{age:22}}) #添加小亮年龄22
查询 age 取模7等于4的文档:
db.hobbies.find({age:{$mod:[7,4]}})
查询结果如如图所示::
$in 包含
查询 age =17或 age =20的文档 :
db.hobbies.find({age:{$in:[17,20]}})
查询结果如图所示:
$nin 不包含
查询 age !=17且 age !=20的文档:
db.hobbies.find({age:{$nin:[17,20]}})
查询结果如图所示:
$size 数组元素个数
可以查询特定长度的数组,比如 hobbies 这一字段,查询有两个爱好的文档:
db.hobbies.find({hobbies:{$size:2}})
查询结果如图所示:
查询结果排序
查询结果排序语法如下:
db.collection.find().sort({_id:1}) #将查询结果按照_id升序排序
db.collection.find().sort({_id:-1}) #将查询结果按照_id降序排序
假设数据库有集合 student 如下:
_id | name | age | sex | major |
---|---|---|---|---|
1 | 王晓丽 | 19 | 女 | 计算机 |
2 | 张明 | 21 | 男 | 计算机 |
3 | 秋雅 | 20 | 女 | 播音主持 |
4 | 张欣欣 | 18 | 女 | 表演 |
$or 条件之间的或查询
$or 表示多个查询条件之间是或的关系,比如查询性别 sex 为 男 或年龄 age 为18的文档信息:
db.student.find({$or:[{sex:"男"},{age:18}]})
查询结果,如图所示:
$and 条件之间的且查询
$and
表示多个查询条件之间是且的关系,比如查询年龄 age 大于18且小于21(18 < age < 21)的信息:
db.student.find({$and:[{age:{$gt:18}},{age:{$lt:21}}]})
查询结果,如图所示:
$not 条件取反查询
$not 用来执行取反操作,比如查询年龄 age 大于等于20岁,然后进行取反(即查询年龄小于20岁的文档):
db.student.find({age:{$not:{$gte:20}}})
查询结果,如图所示:
正则表达式匹配查询
查询不符合major=计*开头文档:
db.student.find({major:{$not:/^计.*/}})
查询结果,如图所示:
count() 返回结果集总数
比如返回上一步正则查询到的结果集有几条:
db.student.find({major:{$not:/^计.*/}}).count()
查询结果,如图所示: