什么样的场景会需要MongoDB
首先,我们已经学了很多数据库了,Redis、Mysql、Oracle,那为什么还需要MongoDB呢
看看下面这样的需求场景:
1、数据量很大
2、写入操作频繁
3、价值较低(解释一下:就是说在几十万数据中零星丢个几条,问题不大,不会影响业务)
对于这样的功能需求,非常适合用MongoDB来实现数据存储
什么是MongoDB
- MangoDB是一个基于分布式文件存储的数据库 (分布式就是将数据分散在多台独立设备上,文件存储就是说MangoDB可以直接存储像文本、音频、视频这样的数据,以GridFS方式)
- 由C++编写,旨在为Web应用提供可扩展 的高性能数据存储解决方案
- MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库中功能最丰富(支持一些条件查询,但数据是以非关系型数据库中的K-V形式存储的),最像关系型数据库的
- MongoDB支持的数据结构非常松散,是类似于json的bson格式(啊,其实就是把json转成字节类型,目的是为了读写快),因此可以存储比较复杂的数据类型,字段值可以包含其他文档、数组及文档数组
特点
(反正也记不太住,看看了解一下)
- 最大的特点:它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似于关系型数据库单表查询的绝大部分功能,而且它还支持设置任何属性的索引。
- 主要特点是:高性能、易部署、易使用、存储数据非常方便
主要的功能特性有:
1、面向集合存储,易存储对象类型的数据
2、模式自由
3、支持动态查询(可以简单的理解为参数是先由占位符占着的,等程序运行时传入实际参数才进行查询)
4、支持完全索引,包括内部对象和内嵌数组,没有复杂的连接
5、支持复制和故障恢复
6、使用高效的二进制数据存储,包括大型对象(如视频等)
7、自动处理碎片,以支持云计算层次的扩展性
8、支持多种语言(如ruby,python,java,c++,php,c#等多种语言)
MongoDB的体系结构
- MongoDB的文档(document),相当于关系数据库中的一行记录(即一条数据)
- 多个文档组成一个集合(collection),相当于关系数据库中的表
- 多个集合,逻辑上组织在一起,就组成了数据库(database)
- 一个MongoDB实例支持多个数据库(database)
层次结构如下图所示:
对照关系型数据库来理解其结构
MongoDB | 关系型数据库 |
---|---|
数据库(databases) | 数据库(databases) |
集合(collection) | 表(table) |
文档(document) | 行(row) |
MongoDB数据类型
- String :存储数据常用的数据类型,在MongoDB中,UTF-8编码的字符串才是合法的
- Integer:用于存储数值,根据服务器,可分为32位或64位
- Boolean : 用于存储布尔值
- Double:用于存储浮点值
- Array:将数组或列表或多个值存储为一个键
- TimeStamp:时间戳,记录文档修改或添加的具体时间
- Object: 用于内嵌文档
- Null:用于创建空值
- Symbol符号:等同于字符串类型,但不同的是,它一般采用特殊符号类型的语言
- Date日期时间:用UNIX时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建Date对象,传入年月日信息
- Object ID对象:用于创建文档的ID
- Binary Data 二进制数据:用于存储二进制数据
- Code代码类型:用于在文档中存储JavaScript代码
- Regular expression正则表达式类型:用于存储正则表达式
PS:值得说一下的Object ID
MongoDB中存储的文档必须有一个_id键,这个键的值可以是任何类型的,默认是个ObjectID对象
ObjectID类似唯一主键,可以很快的生成和排序,包含12 bytes,含义如下:
1、前4个字节表示创建unix时间戳,格林尼治时间UTC时间,比北京时间晚了8个小时
2、接下来的3个字节是机器标识码
3、紧接着的2个字节由进程id组成PID
4、最后3个字节是随机数
Docker安装MongoDB
- docker拉取镜像
docker pull mongo:latest
下载成功后如下图所示:
用docker tag 命令给镜像改个名哈,当然不改也行
- 启动进入
docker run -itd --name mongo --hostname mongo -p 27017:27017 mongo
- 进入mongoDB容器
docker exec -it mongo bash
- 连接数据库
mongo
或者
mongo 127.0.0.1
在执行这条命令之前可以看看mongo --help看看mongo支持的一些命令
MongoDB的常用命令
mongo命令登录后,首先可以用help命令看看支持的一些命令
- 看看当前实例下的数据库(show databases)
- 选择和创建数据
use 有则使用,没有则创建,只有创建了集合后才能看到数据库
这是当数据库本身存在时:
这是我们创建一个数据库:
- 插入和查询文档
我们插入一些数据并进行查询
> db.comment.insert({_id:"1",content:"NoSQL就是最好的!",userId:"001",thumbUp:2022})
WriteResult({ "nInserted" : 1 })
> db.comment.insert({_id:"2",content:"不,Mysql才是最好的",userId:"002",thumbUp:2023})
WriteResult({ "nInserted" : 1 })
> db.comment.insert({_id:"3",content:"能砍菜的刀都是好刀",userId:"003",thumbUp:2024})
WriteResult({ "nInserted" : 1 })
> db.comment.insert({_id:"4",content:"坚持写bug,让世界更快乐",userId:"004",thumbUp:2025})
WriteResult({ "nInserted" : 1 })
> db.comment.find()
{ "_id" : ObjectId("624c8bd4e70580ee616dd388"), "name" : "Dean", "id" : "1" }
{ "_id" : "1", "content" : "NoSQL就是最好的!", "userId" : "001", "thumbUp" : 2022 }
{ "_id" : "2", "content" : "不,Mysql才是最好的", "userId" : "002", "thumbUp" : 2023 }
{ "_id" : "3", "content" : "能砍菜的刀都是好刀", "userId" : "003", "thumbUp" : 2024 }
{ "_id" : "4", "content" : "坚持写bug,让世界更快乐", "userId" : "004", "thumbUp" : 2025 }
- 条件查询
> db.comment.find({userId:"002"})
{ "_id" : "2", "content" : "不,Mysql才是最好的", "userId" : "002", "thumbUp" : 2023 }
> db.comment.find().limit(2)
{ "_id" : ObjectId("624c8bd4e70580ee616dd388"), "name" : "Dean", "id" : "1" }
{ "_id" : "1", "content" : "NoSQL就是最好的!", "userId" : "001", "thumbUp" : 2022 }
单纯看名字应该可以看出是什么意思,就不多说了
- 修改和删除数据
> db.comment.update({_id:'2'},{$set:{thumbUp:20000}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.comment.find({userId:"002"})
{ "_id" : "2", "content" : "不,Mysql才是最好的", "userId" : "002", "thumbUp" : 20000 }
> db.comment.remove({name:"Dean"})
WriteResult({ "nRemoved" : 1 })
> db.comment.find()
{ "_id" : "1", "content" : "NoSQL就是最好的!", "userId" : "001", "thumbUp" : 2022 }
{ "_id" : "2", "content" : "不,Mysql才是最好的", "userId" : "002", "thumbUp" : 20000 }
{ "_id" : "3", "content" : "能砍菜的刀都是好刀", "userId" : "003", "thumbUp" : 2024 }
{ "_id" : "4", "content" : "坚持写bug,让世界更快乐", "userId" : "004", "thumbUp" : 2025 }
- 更多操作(例如count和正则表达式)
可视化工具
一直从控制台打这个代码实在是太不方便了,尤其有好多花括号和圆括号,所以选择一个可视化工具非常重要,我这里最终选择了Rob 3T
MongoDB有很多可视化工具,如robomongo,Studio 3T(功能强大但收费),Robo 3T(免费)
以上。(实在太困了,先睡了)