跳到主要内容

3.1-MongoDB数据库

Create by fall on 16 Nov 2020 Recently revised in 12 Oct 2023

MongoDB

由 C++ 编写的基于分布式文件存储的开源数据库系统

官网:https://www.mongodb.com

特点

  • 将数据存储为一个文档,由键值对组成,类似于 JSON 对象,字段值可以包含其他文档数据文档数组
  • 高负载添加更多节点,能保证服务器性能
  • 可以在 MongeDB 中设置任何属性的索引,来实现更快的排序
  • 通过本地或者网络创建数据镜像,可扩展!
  • 负载的增加(需要更多的存储空间和更强的处理能力)它可以分布在计算机网络中的其他节点上
  • 支持丰富的查询表达式,查询指令使用 JSON 进行标记,可轻易查询文档中的内嵌的对象及数组
  • 允许在服务端执行脚本,使用 JS 编写函数,在服务端执行,也可以把函数的定义存在服务端,下次直接调用。
  • 支持各种编程语言,安装简单。

语法特性

  • 使用 update() 命令可以实现替换完整地文档,或者是一些指定的字段
  • Map/reduce 对数据进行批量处理和聚合。Map 函数调用 emit(key,value) 遍历集合中所有的记录,将 keyvalue 交给 Reduce 函数处理。
  • Map 函数和 Reduce 函数是使用 Javascript 编写的,并可以通过 db.runCommandmapreduce 命令来执行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管理工具,轻量级, 支持多国语言.

相关概念

关键字对比

MySQLMongoDB解释说明
databasedatabase数据库
tablecollection表/集合
rowdocument行/文档
columnfield字段/域
indexindex索引
join嵌入文档表关联 / MongoDB不支持 join,MongoDB 通过嵌入式文档来替代多表连接
primary keyprimary key主键 / MongoDB 自动将 _id 字段设置为主键

数据库

打开 mongo.exe 或者是图形化界面下方提供的命令行工具,该命令行工具是 JavaScript shell 可以进行一些简单的运算。

一个 MongoDB 可以建立多个数据库

默认的数据库为 db 数据库存储在 data 目录中

MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放在不同的文件中

数据库命名规则

  • 不能是空字符串
  • 不能含有 (空格).(点)$(美元符号)/(左斜杠)\(右斜杠)和 \0(空字符)
  • 应该全部小写
  • 最多 64 个字节

部分数据库名称是保留的,有特殊作用

  • admin 权限角度来看,这是 root 数据库,将一个用户添加到这个数据库,这个用户会自动集成所有数据库的权限,一些特殊的服务端命令,也只能通过该数据库进行运行,比如列出所有的数据库,或者是关闭服务器等操作。
  • local 这个数据库永远不会被复制,可以用来存储仅限于本地单台服务器的任意集合
  • configMongo 用于分片设置时,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?