MongoDB 简介

neevop 二月 26, 2023

MongoDB 特性

  1. MongoDB的文档格式基于JSON, JSON是JavaScript Object Notation的简称。JSON数据结构由键值对组成,也可以内置嵌套,与其他语言中的哈希映射或字典类型相似。
  2. 使用MongoDB JavaScript shell就可以读取,查询或者操作数据库的类JSON数据信息。查询功能是专门用于处理结构化文档操作的,和关系型数据库的查询操作是同一层次的。
  3. MongoDB在多个方面备受批评,但是MongoDB缺少架构定义意味着其更加灵活,更适合快速开发模式。关系型数据库的表里存储行,每个表都有严格的schema,指定每个列的数据类型,如果某行数据需要扩展字段,就必须修改表结构。MongoDB每个集合中的文档都可以拥有不同的数据结构,是机场,集合的文档都是相对一致的。
  4. 数据库很大程度上是由其数据模型定义的,MongoDB的数据模型是面向文档的。关系型数据库包含表,MongoDB拥有集合,可以把集合当成一组文档数据。
  5. MongoDB以二进制JSON格式存储文档数据,或者叫做BSON。当查询MongoDB并返回结果时,数据就会转换成易于阅读的数据格式。

索引

  1. MongoDB中的索引使用了B-树(平衡树)数据结构。新的MongoDB已经支持日志结构合并-树(LSM)。
  2. MongoDB给每个文档对象一个唯一的数据标识,辅助索引(secondary indexes)。使用MongoDB,每个集合我们可以创建64个索引。

复制

  1. MongoDB提供了数据库复制特性,叫做可复制集合(replica set)。可复制集合在多个机器上分布式存储数据,实现数据冗余存储和自动备灾。可复制集合的主节点可以同时接受读/写操作,但是从节点只能进行读操作。
  2. 可复制集合可以自持自动化备灾,如果主节点失败,则集群中会选择一个从节点自动提升为主节点,当之前的主节点回归时,它会继续作为从节点。

加速和持久化

  1. 在数据库领域中,写入速度和持久化存在着矛盾关系,数据库设计者经常需要在速度和持久性之间妥协,做出最佳平衡。
  2. 对于MongoDB,用户通过选择写入语义来维持速度与持久性之间的平衡,默认启用了日志功能。启用日志功能后,默认100ms就会写一次日志文件。如果服务器意外关机,日志会通过重启服务来确保MongoDB数据文件恢复为一致状态。
  3. 对于写入压力,可以通过关闭日志功能来提高性能。此时建议使用主从复制模式来保证数据的完整性。

伸缩

  1. 伸缩数据库最简单的方式就是升级服务器硬件。提升单个节点硬件参数的做法通常称为垂直扩展(vertial scaling / scaling up)。到达某个临界点后成本会陡增。
  2. 水平扩展(hirizontal scaling / scaling out)指的是在多台机器上分布式存储数据库。水平扩展通常可以减小硬件成本,跨机器分布式存储数据可以降低数据丢失的风险。
  3. MongoDB通过基于范围的分区机制来实现水平扩展,可以自动化的管理分布式节点存储的数据。分片系统处理额外的分片节点,还会处理自动化备灾。每个独立的节点是一个可复制的集合,至少由两台机器组成,确保节点失败时自动恢复。

命令行工具

  1. mongodumpmongorestore ——备份和恢复数据库的工具。这个用具将数据库数据保存为原生的BSON格式,因此最适用于备份。而且具有适合热备份的优势。
  2. mongoexportmongoimport——导入或者导出JSON,CSV,TSV格式的数据。
  3. mongosniff——一个用于发送给数据库命令的嗅探工具。
  4. mongostat——与iostat类似,这个工具用来轮训MongoDB,提供有帮助的状态信息。
  5. mongotop——与top类似,显示MongoDB在每个集合花费的读写数据的时间总和。
  6. mongoperf——帮助我们了解MongoDB实例磁盘操作的情况。
  7. mongooplog——展示MongoDB操作日志里面的信息。
  8. Bsondump——把BSON文件转换为人类可读的格式。

限制

  1. BSON文档大小限制为16MB,MongoDB更适合管理小文件。
  2. MongoDB文档的嵌套深度最大值限制为100,对深入嵌套的文档处理会导致堆栈溢出。
  3. 如果要存储大的二进制对象,比如图片或者视频,可以参考对大二进制对象的处理技术。

核心概念

  1. 数据库
    • 管理数据库:MongoDB没有显示的创建数据库的方式,会在第一次写入数据的时候床技爱你数据库。要删除数据库就意味着丢失所有的集合,会从磁盘上产出数据库文件,因此没办法回滚。
    • 数据库文件和分配:数据库问阿金存储在启动mongod时depth参数指定的目录里,不指定时,mongod会在/data/db文件夹里存储数据。所有数据库文件都前缀了属于自己的数据库名字。
  2. 集合
    • 管理集合:创建标准集合时可以通过参数指定预分配空间的字节大小,通常没有必要。集合名字可能包含数字、字母或者圆点字符。集合名字通过其命名空间来区分,包含所属的数据库名字。完全限制的集合名字不能超过128个字符。圆点符号可以用作虚拟的命名空间。
    • 集合也可以重命名。
  3. 固定集合 ( capped collection)
    • 固定集合因为有文档数量上的限制,一旦达到集合上限,后续的插入将会覆盖最先插入的文档数据。
    • 固定集合可以设置空间大小限制,也允许指定最大文档数量限制,空间大小配置具备优先权。
    • 固定集合不允许正常集合的所有操作,例如不可以删除单个文档,不能增加文档的大小。
    • 生存时间集合(TTL, time-to-live)允许在特定时间后废弃文档数据。
  4. 系统集合
    • MongDB的部分设计依赖于内部集合的使用,有两个特殊的集合:system.namespacessystem.indexes,都是标准集合,调试的时候非常有用。

数据类型

  1. 字符串:所有字符串都必须使用UTF-8编码。
  2. 数字: BSON指定了三种数据类型: double、int、long。可以编码任意IEEE浮点值以及任意8B长度的有符号整数。JavaScript智支持一种数据类型角度Number,等价于IEEE 754 Double。因此从shell保存一种数据类型为整数时,需要显式指定类型。
  3. 时间:-