导图社区 MongoDB
这是一篇关于MongoDB的思维导图。
编辑于2020-10-29 19:38:02MongoDB
介绍
MongoDB是由C++编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB数据存储为一个文档,数据结构由键值对(key=>value)组成,类似于Json对象,字段值可以包含其他文档,数组及文档数组
特点
1.是一个面向文档存储的数据库,操作起来比较简单和容易
2.支持丰富的查询表达式,查询指令使用的Json形式的标记,可轻松查询文档中内嵌的对象和数组
3.支持多种语言(Java、Python、C++、php、C#等)
4.安装简单
5.非关系型数据库(非关系型数据库的实质:非关系型数据库产品是传统关系型数据库的功能阉割版,通过减少用不到或很少用的功能,来大幅度提高产品性能。)
6.数据表就是聚合,数据行就是文档
安装
1.下载
2.安装
3.环境变量配置
4.创建目录
MongoDB将数据目录存储在db目录下,需要手动的去创建
运行MongoDB
1.打开命令行:(快捷键win+R),输入cmd后回车,就可以打开命令行工具。
2.执行mongod:在命令中直接输入mongod,但是你会发现服务并没有启动,报了一个exception,服务停止了
3.新建文件夹:出现上边的错误,是因为我们没有简历Mongodb需要的文件夹,一般是安装盘的根目录,建立data/db,这两个文件夹。
4.运行mongod:这时候服务就可以开启了,链接默认端口是27017。
链接服务
在上一步的链接开启后,我们可以使用命令行来链接服务端(mongo),重新打开命令行工具,输入mongo命令。
查看数据库:
show dbs
查看数据库的版本:
db.version()
基础命令1
show dbs
显示已经有的数据库(如果是刚刚安装好,会有默认的local、admin默认数据库)
use xxxx
use+数据库名称,进入数据库,也可以理解为使用数据库
成功:显示switched to xxxx
show collections
显示数据库中的集合(关系型数据库中叫表)
db
显示当前所在的数据库名称。在操作前尽量先查看下自己在哪个数据库,以免造成操作错误
基础命令2
use db(建立数据库)
use不仅可以进入一个数据库,如果你要进入的库不存在,则建立一个新的库。但是在没有集合前,它还是默认为空的
db.集合.insert()
新建数据集合和插入文件(数据)
db.集合.find()
查询所有数据(列出集合下的所有数据)
db.集合.update({xx:xx})
修改文件数据,第一个是查询条件,第二个是要修改成的值
db.集合.remove(条件)
删除文件数据,注意的是要跟一个条件
db.集合.drop()
删除整个集合
db.dropDatabase()
删除整个数据库(一定要先进入数据库,然后再删除)
用js写mongo命令
在黑窗口写mongo命令(shell)是在太麻烦了
在Js里写mongo的shell命令大部分是相同的,只有小部分是不同的
1.新建JS文件
2.执行JS文件(mongo xxx)
批量插入
第一个是快速存储能力。
第二个是方便迅速查询能力
批量数据插入是以数组的方式进行的
注意一次插入不要超过48M,向.zip和大图片什么的尽量用静态存储,MongoDB存储静态路径就好,这也算是一个规则
Update常见错误
错误1
只update修改项(可以声明一个变量,然后把要改变数据的全部信息放入变量,最后执行修改操作)
现在这种方法才是正确的,数据修改正常了,但是你会发现写起来非常麻烦,而且特别容易写错。下节课我们会介绍update修改器,可以很好的解决这个问题。
修改器
$set
用来修改一个指定的键值(key),这时候我们要修改上节课的sex和age就非常方便了,只要一句话就可以搞定。
$unset
它的作用其实就是删除一个key值和键
$inc
对数字进行计算
修改的必须是数字,字符串不起效果
multi
给多个添加(例如:给每个人都加上爱好这一栏)
1.第一种方法只能给第一个添加
2.第二种方法,可以给符合条件的所有插入
upsert
upsert是在找不到值的时候,直接插入这条数据
upset也有两个值:true代表没有就添加,false代表没有则不添加(默认为false)
数组修改器
$push
向数组中追加值
$ne
查找是否存在
主要的作用是,检查一个值是否存在,如果不存在再执行操作,存在就不执行
$addToSet
$each
批量追加
它可以传入一个数组,一次添加多个值进去,相当于批量操作,性能同样比循环操作要好的多
应答式写入(db.collections.update)
前面介绍的print(‘success’)在后面实际开发中是不适合使用的
db.collections.update
用一个值来接受运行后的结果,打印出来
返回结果
{ "connectionId" : 1, "updatedExisting" : true, "n" : 2, "syncMillis" : 0, "writtenTo" : null, "err" : null, "ok" : 1}
false:第一句末尾的false是upsert的简写,代表没有此条数据时不增加;
true:true是multi的简写,代表修改所有,这两个我们在前边课程已经学过。
getLastError:1 :表示返回功能错误
printjson:表示以json对象的格式输出到控制台。
查询数据库是否链接成功
db.runCommand({ping:1})
返回ok:1就代表链接正常。
findAndModify
findAndModify是查找并修改的意思。配置它可以在修改后给我们返回修改的结果。我们先看下面的代码:
属性值
query:需要查询的条件/文档
sort: 进行排序
remove:[boolean]是否删除查找到的文档,值填写true,可以删除。
new:[boolean]返回更新前的文档还是更新后的文档。
fields:需要返回的字段
upsert:没有这个值是否增加。
find()查询条件
这两种写法是一样的效果,有些事后查出的结果太多,看着比较乱,我们可以使用名称:true/false来控制是否显示(1/0也可以)
不等修饰符
小于($lt):英文全称less-than小于等于($lte):英文全称less-than-equal大于($gt):英文全称greater-than大于等于($gte):英文全称greater-than-equal不等于($ne):英文全称not-equal
在当前数据库的high集合中查询所有age大于19且小于22的人,并且只显示age和name字段,其余字段均不显示
find()多条件查询
查询一个key多个value
$in (查询满足多个条件中的一个)
$nin (与$in相反,查询不在条件中的文件)
查询中年龄为19,20的人,显示名称和年龄字段
查询多个key
$or (满足条件中的一个就显示)
查找年龄小于等于20,或者兴趣中有Music的人
$and (满足所有条件才展示出来)
查询年龄小于等于20,且兴趣中有Music的人
$not (除了——把所有不符合条件的列出来)
查询年龄大于21,或者年龄小于19的人
find()数组操作
查询hobby数组中有Music的人,不能用['Music'],加上中括号就是完全匹配
$all (查询数组中满足多个值的)
查询hobby数组中既喜欢Music又喜欢Movie的人
$in (查询数组中满足条件中一个就显示)
查询hobby数组中有Music、Movice、Games其中一个的显示出来
$size (查询中数组的长度与条件长度相等的)
查询出所有人中,hobby数组长度为6的人的个数
$slice (显示查询出的条件的前几项)
查询出所有人中,hobby数组长度为6的人的个数,并在现实的时候只显示兴趣的前三个
可以为负数,显示倒数第几个
find()的参数使用
query
这个是查询条件,比如年龄大于20小于22的
fields
(返回)内容查询出来后显示的结果样式,可以用true或者false控制是否显示
limit
返回的数量,后面跟数字,控制每次查询返回的结果数量
skip
跳过多少个显示,结合limit可以实现分页
sort
排序方式,1是从小到大排,-1是从大到小排
分页展示,limit(n)代表每页显示几个,skip(n)代表跳过几个,sort({age:1})代表从小到大排序
$where
配合JavaScript语句进行查询
缺点:不安全,查询时数据库压力较大
查询年龄大于20的人
用js来查询
MongoDB索引
插入200万条数据(没有索引)
可以看到200万条数据用时1分18秒,还是很快的
插入后可以使用 db.randomDate.stats()来查看有多少条数据
200万条数据的查询(未加索引)
消耗时间2秒
加入索引
提升200倍的性能
缺点:消耗内存
一个表最多可以建64个索引
200万条数据的查询(加入索引)
加入索引后第一次查询,仅消耗32ms
加入索引后第二次查询,缓存后,查询速度变得更快了
索引的坑
索引虽然可以提升速度,但不是所有地方都可以的,下面我们来看一下
数据不超万条时,不需要使用索引。性能的提升并不明显,而大大增加了内存和硬盘的消耗
查询数据超过表数据量30%时,不要使用索引字段查询。实际证明会比不使用索引更慢,因为它大量检索了索引表和我们原表。
数字索引,要比字符串索引快的多,在百万级甚至千万级数据量面前,使用数字索引是个明确的选择。
把你经常查询的数据做成一个内嵌数据(对象型的数据),然后集体进行索引。
总结
复合索引
再创建一个索引
db.randomDate.getIndexes()
查看当前有哪些索引
复合索引的查询方法
可以看出,复合索引第一次查找耗时156ms
符合索引第二次查找耗时112ms
删除索引
错误的写法
根据key删除会报错,查询name进行删除
正确的方法
db.randomDate.getIndexes()查看有哪些索引
需要根据他的name删除
db.randomDate.dropIndex('userName0_1')
全文索引
先连接数据库,插入两条数据
db.info.insert({contextInfo:"I am a programmer, I love life, my honey and running. I always listen music after school"})db.info.insert({contextInfo:"I am a programmer, I love play Games, I don't want to play Games goognight!!"})
插入索引
db.info.ensureIndex({contextInfo:'text'})
利用索引查询
db.info.find({$text:{$search:"programmer life"}})
查询数据中包含programmer 或者life的数据(or的关系)
db.info.find({$text:{$search:"programmer honey -Games"}})
查询数据中包含前面几个词的,但不得包含Games的
查询带空格的,使用MongoDB给我们提供的方法
my honey中间是有空格的,放在\" xx \"之间
MongoDB管理
创建用户
删除用户
db.system.users.remove({user:"joseph"})
用户创建了之后是不能使用的,需要先建权(登录)
db.auth("joseph","123456")
返回1,建权成功,返回0,失败
建权后重启mongo服务(开启建权服务)
使用命令mongod -auth
连接服务
mongo -u joseph -p 123456 127.0.0.1:27017/admin
mongo -u 用户名 -p 密码 本机地址/库
连接后就可以进行查询使用了
备份/还原数据库
mongodump --host 127.0.0.1 --port 27017 --out D:/backup/
备份
mongorestore --host 127.0.0.1 --port 27017 D:/backup/
还原
图形界面
在安装mongoDB后,会默认有一个图形化界面,开启mongo服务后打开
方便快捷
推荐视频:https://www.bilibili.com/video/BV1Pt41127jc?p=1
推荐博客:https://jspang.com/