目的
对MongoDB中操作逻辑和存储结构进行详细介绍。
基本的操作
常用的命令和基础知识
1、进入MongoDB shell
首先我们进入到MongoDB所在目录执行
1 | cd /work/app/mongodb/bin/ |
为了方便执行我们可以,这样直接在终端输入mongo调用就可以了
1 | alias mongo='/work/app/mongodb/bin/mongo' |
如果想永久生效,把他加入到/etc/profile中即可
2、查看数据库命令
1 | #可以通过show dbs; 或者 和Mysql一样执行show databases; |
3、打开数据库
和关系型数据库中打开数据库是一样的
1 | #使用数据库使用use dbs即可,进入后可以使用showtables;去查看数据库中的表 |
从上面可以看出,一个MongoDB实例是由一个或多个数据库组成的
但是这里需要注意:
在Mysql中的表中,我们给里面的每行叫做‘记录’,但是在MongoDB中我们给每行数据叫做‘文档’
所以在MongoDB中我们给每个表叫做‘集合’。集合中就是存储了文档的集合。
查看当前数据库中的集合命令为:
1 | show collections; |
所以:show tables; 和 show databases;命令只是兼容关系型数据库而已,因此他们之间的层次关系就明白了,NICE~
总结:
1、MongoDB逻辑概念总结
文档:文档(Document)是MongodDB中的核心概念,他是MongoDB逻辑存储的最小基本单元
集合:多个文档组成的集合
数据库:多个集合组成的数据库
MongoDb | 关系型数据库Mysql |
---|---|
文档(document) | 行(row) |
集合(collections) | 表(table) |
数据库(databases) | 数据库(databases) |
2、MongoDB 物理存储总结
2.1 命名空间文件:命名空间(.ns结尾文件) 它存储了分配和正在使用的磁盘空间
2.2 数据库文件:以(0,1,2,3…)结尾的,并且后面的文件大小是前面一个文件大小的2倍!
为什么MongodDB物理存储使用这种方式设计呢?好处是什么?:当一方面如果数据库很小的时候,不至于数据库小而浪费存储空间,另外一方面如果数据库增长比较快,通过预分配的方式,是上一个文件的两倍的办法,来避免数据的剧增造成分配文件造成的性能下降,来预分配空间,以空间的办法来换取性能的提升。
2.3 日志文件
1 | 系统日志文件logpath |
慢查询日志通过help就可以看到如何启用
1 | #这两个参数需要组合使用 --slowms 大于多少秒才算慢查询 |
我们可以通过配置文件进行设置:
1 | profile=1 |
MongoDB数据类型
MongodDB的数据类型是:BSON的数据类型
BSON:是Binary JSON是二进制的格式,能将MongoDB的所有文档表示为字节字符串!
JSON:是一种轻量级的数据交换格式。它基于JavaScript的一个子集!
一、在初识MongoDB的时候了解“帮助”
1、最高的帮助
在MongoDB shell中输入help
1 | > help |
2、打开数据库在数据库中查看帮助
进入到数据库中后我们可以使用db.help()查看数据库级别的帮助
1 | db.help() #查看数据库级别的帮助,里面会显示数据库级别的帮助 |
3、查看集合中的帮助
1 | > show dbs; |
创建数据库
查看当前的数据库
1 | > show dbs; |
可以看到当前只有tim和系统自带的local数据库,我们通过use 去打开一个数据库!shuai并且查看数据库
1 | > use shuai; |
发现数据库并没有添加,当我们在给数据库中的集合插入一条文档的时候就会:自动创建一条文档合、一个集合、一个数据库。
1 | > db.users.insert({"uid":1}) |
2、插入一条数据
1 | > db.users.insert({"uid":2,"uname":"luotianshuai","isvip":true,"sex":null,"favorite":["apple","banana",1,2,3,4,5],"regtime":new Date()}) |
注:这里的数据类型,列表、字典,这里的new Date()是MongoDB就类似Django Model的时间选项类似于:date = models.DateTimeField(auto_now=True)
3、查询数据
查询一条数据
1 | > db.users.findOne({"uid":2}) |
并且我们可以吧取出来的数据保存在一个变量中,并且通过变量去调用其值
1 | > a = db.users.findOne({"uid":2}) |
MongoDB中的数据类型和Mysql数据类型对比
1 | > db.users.insert({"uid":3,"salary":312402039840981098098309,"a":1.2423412314223423413}) |
1、MongoDB中的数字类型和Mysql中的数字类型对比
查看MongoDB中的数字类型他们都是number类型的
1 | > typeof(b.uid) |
可以看出在MongoDB中所有的数字类型都是数值类型的,我们比较下Mysql中的数字类型!
在Mysql中类似“uid”:3 这个3应该属于普通的整数,或者是短整形
类似薪水:salary 应该是长整型
类似a应该是双精度浮点型
数字:
在Mysql中对数字类型分的非常详细,有短整形、长整型,浮点数分为单精度和双精度浮点型,而在MongoDB都是64位的浮点数!这样的好处就是很简单,他不需要区分数字类型,就是number类型,简单、简洁。容易理解和在处理的时候也方便。
字符串:
在Mysql中分为定长、变长字符串,无论是定长字符串或者变长字符串,都要对长度事先定义!但是MongoDB中无需事先定义,对长度没有并且的定义并且他甚至可以存储一篇文章!也表现的简单、简洁、
布尔型:
布尔值只有:真、假分别用:True False 表示
null值:
1 | > db.users.find({"sex":null}) |
咱们查询以”sex“ 为null条件,但是查询出了3条结果可以得出:
在MongoDB中,1、null代表着值为null 2、者字段不存在。
那么怎么把字段存在并且为null值得文档查找出来呢?
1 | > db.users.find({"sex":null,"sex":{"$exists":true}}) |
数组:
一组数据集合
对象类型:
比如日期类型,日期类型是通过对象类型产生的,但是处理日期比较麻烦!这个也是MongoDB的问题表现力不足
BSON的特点:优点:简单、简洁、容易理解、解析方便、记忆
缺点:表现力不足比如日期格式(处理起来就比较麻烦)
命名规则
1、文档的键名命名几乎所有utf8字符串,只有以下少数例外
- $开头
- \0 空字符串
- _下划线开头,可以用但是不建议使用,凡是系统生成的都是以_开头命名的,所以在实际生产中我们不使用_开头的!
2、集合的命名几乎所有的utf8字符串,只有以下少数例外
$开头
\0 空字符串
system.开头
”“空字符串
3、数据库的命名几乎所有的utf8字符串,只有以下少数例外
$开头
\0 空字符串
system.开头
”“空字符串
/
\
并且这里需要注意:数据库名是不区分大小写的,如果你有一个shuai的数据库,你在创建一个SHUAI的数据库插入数据的时候就会报错,我们一般创建数据库的时候都把MongoDB的数据库名为小写。