mongodb学习笔记

一.安装

二.常用命令

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 内容如下:

_idnamesexhobbies
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 如下:

_idnameagesexmajor
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()  

查询结果,如图所示:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值