3.1-MongoDB数据库
Create by fall on 16 Nov 2020 Recently revised in 12 Oct 2023
MongoDB
由 C++ 编写的基于分布式文件存储的开源数据库系统
特点
- 将数据存储为一个文档,由键值对组成,类似于 JSON 对象,字段值可以包含其他文档,数据及文档数组。
- 高负载添加更多节点,能保证服务器性能
- 可以在
MongeDB
中设置任何属性的索引,来实现更快的排序 - 通过本地或者网络创建数据镜像,可扩展!
- 负载的增加(需要更多的存储空间和更强的处理能力)它可以分布在计算机网络中的其他节点上
- 支持丰富的查询表达式,查询指令使用
JSON
进行标记,可轻易查询文档中的内嵌的对象及数组 - 允许在服务端执行脚本,使用 JS 编写函数,在服务端执行,也可以把函数的定义存在服务端,下次直接调用。
- 支持各种编程语言,安装简单。
语法特性
- 使用
update()
命令可以实现替换完整地文档,或者是一些指定的字段 Map/reduce
对数据进行批量处理和聚合。Map
函数调用emit(key,value)
遍历集合中所有的记录,将key
和value
交给Reduce
函数处理。Map
函数和Reduce
函数是使用Javascript
编写的,并可以通过db.runCommand
或mapreduce
命令来执行MapReduce
操作。GridFS
是一个内置功能,可以存放大量小文件
优点
- Free-schema 无模式文档,适应非结构化数据存储;
- 内置 GridFS,支持大容量的存储;
- 内置 Sharding,分片简单
- 弱一致性(最终一致),更能保证用户的访问速度
- 查询性能优越,对于千万级别的文档对象,差不多10个G,对有索引的 ID 的查询不会比 MySQL 慢,而对非索引字段的查询,完胜 MySQL
- 聚合框架,它支持典型几种聚合操作 , 比如,Aggregate pipelien, Map-Reduce等;
- 支持自动故障恢复
缺点
- 太吃内存,快是有原因的,因为MongoDB把数据都放内存里了;
- 对事务的支持不够友好;
- 占用空间过大;
- 对联表查询的支持不够强大;
- 只有最终一致性,言外之意,就是可能造成数据的不一致,如果想要保持强一致性,必须在一个服务器处理所有的读写操作,坑;
- 复杂聚合操作通过 mapreduce 创建,速度慢;
- Mongodb 全局锁机制也是个坑;
- 预分配模式会带来的磁盘瓶颈;
- 删除记录时不会释放空间,相当于逻辑删除,这个真的坑;
- MongoDB 到现在为止,好像还没有太好用的客户端工具;
具体的应用场景
- High performance - 对数据库高并发读写的需求。
- Huge Storage - 对海量数据的高效率存储和访问的需求。
- High Scalability && High Availability - 对数据库的高可扩展性和高可用性的需求。
比如以下类型的项目中:
- 游戏场景:使用 MongoDB 存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。
- 物流场景:使用 MongoDB 存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来。
- 社交场景:使用 MongoDB 存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。
- 物联网场景:使用 MongoDB 存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。
- 视频直播:使用 MongoDB 存储用户信息、点赞互动信息。
总的来讲,就是
- 数据量大
- 读写操作频繁
- 数据价值较低,对事务要求不高
插件
监控
Munin
:网络和系统监控工具
Gangila
:高性能的系统监视工具
Cacti
:查看CPU的负载, 网络带宽利用率,
GUI
- Fang of Mongo 网页式
- Futon4Mongo – 一个 CouchDB Futon web 的 mongodb 山寨版。
- Mongo3 – Ruby 写成。
- MongoHub – 适用于 OSX 的应用程序。
- Opricot – 一个基于浏览器的 MongoDB 控制台, 由 PHP 撰写而成。
- Database Master — Windows 的 MongoDB 管理工具
- RockMongo — 最好的PHP语言的MongoDB管理工具,轻量级, 支持多国语言.
相关概念
关键字对比
MySQL | MongoDB | 解释说明 |
---|---|---|
database | database | 数据库 |
table | collection | 表/集合 |
row | document | 行/文档 |
column | field | 字段/域 |
index | index | 索引 |
join | 嵌入文档 | 表关联 / MongoDB不支持 join,MongoDB 通过嵌入式文档来替代多表连接 |
primary key | primary key | 主键 / MongoDB 自动将 _id 字段设置为主键 |
数据库
打开 mongo.exe
或者是图形化界面下方提供的命令行工具,该命令行工具是 JavaScript shell 可以进行一些简单的运算。
一个 MongoDB 可以建立多个数据库
默认的数据库为
db
数据库存储在data
目录中MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放在不同的文件中
数据库命名规则:
- 不能是空字符串
- 不能含有
.
(点)$
(美元符号)/
(左斜杠)\
(右斜杠)和\0
(空字符) - 应该全部小写
- 最多 64 个字节
部分数据库名称是保留的,有特殊作用
admin
权限角度来看,这是root
数据库,将一个用户添加到这个数据库,这个用户会自动集成所有数据库的权限,一些特殊的服务端命令,也只能通过该数据库进行运行,比如列出所有的数据库,或者是关闭服务器等操作。local
这个数据库永远不会被复制,可以用来存储仅限于本地单台服务器的任意集合config
当Mongo
用于分片设置时,config
数据库在内部使用,保存相关分片的信息
文档
文档是一组键值对,文档不需要设置相同的字段,相同的字段不需要相同的数据类型
{
"name":"fall"
}
需要注意
- 文档中的键值对是有序的
- 文档中的值不仅可以是双引号的字符串,可以是其他类型,甚至是文档
- 区分类型和大小写
- 文档不能有重复的键
- 文档的键是字符串(任意 UTF-8 字符),少数情况例外
键的命名规范
- 不能含有
\0
字符,这个字符会用来表示键的结尾.
和$
有特殊的意义,只有特殊情况下使用_
开头的键是保留的,没有特殊要求。
副本集合
副本集合(Replica Set)也被称为集群(cluster)。独立的实例不是部署的好选择,因为他能更好的应对单点故障()
With a single server, you are at risk of creating both a bottleneck, and a single point of failure for your applications
在单一服务器中,您有为应用程序中创建瓶颈,或者单一故障点的风险。
参考文章
作者 | 文章名称 |
---|---|
官方文档 | MongoDB |
哪吒编程 | 既然有MySQL了,为什么还要有MongoDB? |