问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MongoDB

创作时间:
作者:
@小白创作中心

MongoDB

引用
1
来源
1.
https://learn.microsoft.com/zh-cn/training/modules/cmu-case-study-nosql-databases/2-mongodb

MongoDB 是一种面向文档的数据库。 MongoDB 避开了关系模型,而采用“无模式”模型,该模型设计为可更加灵活并模仿在面向对象的现代编程语言中的数据建模方式。 MongoDB 还设计为可从头开始扩展,可以自动在多台服务器间拆分数据,并在群集中的服务器间平衡负载。 MongoDB 还允许进行复杂查询(例如,涉及 MapReduce 样式聚合的查询和地理空间查询),从而使 MongoDB 作为地图相关应用程序的数据存储而受到欢迎。 视频 4.42 介绍了 MongoDB

MongoDB 数据模型

文档是 MongoDB 的基本数据单位,大致相当于关系数据库管理系统中的行。 文档是各个键及其关联值的有序集。 文档的示例如下所示:

{
     item: "ABC1",
     details: {
        model: "14Q3",
        manufacturer: "XYZ Company"
     },
     stock: [ { size: "S", qty: 25 }, { size: "M", qty: 50 } ],
     category: "clothing"
}

MongoDB 将文档存储在称为集合的组中。 MongoDB 未对作为集合一部分的文档施加任何限制。 它们可以包含任何数量或类型的键,并且不必相关。 唯一的限制在于,集合中的每个文档都有一个名为 _id 的键,该键对于集合中的每个文档应具有唯一值。 MongoDB 可以为插入到集合中的每个文档自动生成 _id 键。

集合由称为集合名称的 UTF-8 字符串进行标识。 许多开发人员选择使用命名约定将集合分组在一起,如使用 . 字符表示两种类型的博客集合:blog.postsblog.authors。 这纯粹是为了进行组织,MongoDB 会将它们视为单独的不相关集合。

最后,一组集合使 MongoDB 成为数据库。 如同集合一样,MongoDB 数据库由 UTF-8 字符串名称进行标识。

MongoDB 支持丰富的数据类型,包括 32/64 位整数、64 位浮点数、布尔值、日期、字符串、正则表达式、javascript 代码、数组等。 文档还可以进行嵌套,即文档可以将其他文档包含在内,从而使 MongoDB 的数据模型完全嵌套。

在内部,文档使用名为 BSON(二进制 JSON)的格式存储在 MongoDB 中。 MongoDB 中单个文档的大小限制为 4MB。

MongoDB 中的操作

MongoDB 中用于操作数据的主要操作如下所示:插入、删除和更新。 MongoDB 允许进行批量插入,这使应用程序可以在单个请求中插入多个文档。 MongoDB 中的唯一限制是消息大小 (16MB)。 MongoDB 还允许执行一种特殊操作,称为更新插入。 此操作会更新现有文档,如果不存在,则插入新文档。

使用查找命令在 MongoDB 中查询数据。 带有一组条件的查找命令可以用于返回与一组条件匹配的文档。 MongoDB 中的一个微妙限制是查找命令中使用的条件必须是查询本身中指定的常数值。 这意味着在 MongoDB 中编写的查询无法查找其中的特定值与集合中另一个值匹配的文档。

除了简单查询外,MongoDB 还提供了一组聚合工具,可应用于查询中的结果文档集。 聚合范围从简单计数到 MapReduce 函数,可进一步提取和分析从查询返回的数据。

与大多数数据库系统一样,MongoDB 允许对要为集合创建的特定键创建索引。 这可用于减少执行特定类型查询所需的时间。 MongoDB 的一个显著特征是能够对地理空间数据键(如纬度和经度)创建索引。 MongoDB 可以高效地处理对地理空间数据进行的范围查询。

MongoDB 还允许管理员要求系统解释查询,这与热门 RDBMS 所提供的功能类似。 这使管理员可以在 MongoDB 中分析和优化查询执行。

MongoDB 体系结构

MongoDB 将集合和文档作为本地文件系统上的文件进行管理。 如果对特定键创建索引,则 MongoDB 会使用 B 树结构存储索引信息。 MongoDB 实质上是以内存映射方式在磁盘上处理这些文件,而让操作系统和文件系统为包含数据的文件管理内存中缓冲区。

对于小型安装,MongoDB 部署为单节点系统。 为了将 MongoDB 扩展为多个节点,MongoDB 支持两种横向扩展模式:复制和分片。 在复制中,会在多台服务器上维护相同数据的多个副本,以使 MongoDB 可以在节点发生故障时容忍节点故障。 具有相同数据的一组 mongodb 节点称为副本集。 副本集中的一个节点称为主节点,其余节点称为辅助节点。 默认情况下,只有主节点会响应来自客户端的读取和写入请求。 每当有写入数据的操作时,主节点便会发送消息以更新副本。 在此模式中,MongoDB 可保证严格一致性,因为所有数据请求都只由主节点进行处理。


图 5:MongoDB 中的复制

MongoDB 副本集旨在用于自动故障转移。 如果某个节点无法响应的时间超过 10 秒,则假定该节点处于不活动状态,其余节点会投票决定哪个节点应成为新的主节点。

为了分发数据,MongoDB 允许在多个节点间对数据进行分片。 每个分片都是一个独立数据库,分片共同组成单个逻辑数据库。 分片 MongoDB 群集的体系结构如下所示:


图 6:MongoDB 中的分片

分片用于存储数据。 为了在生产分片群集中提供高可用性和数据一致性,每个分片都是副本集。

查询路由器与客户端应用程序形成接口,将操作定向到适当的分片。 查询路由器会处理操作并将操作定向到目标,然后将结果返回给客户端。 一个分片群集可包含多个查询路由器,用于划分客户端请求负载。 客户端将请求发送给一个查询路由器。 大多数分片群集具有许多查询路由器。

配置服务器存储群集的元数据。 此数据包含群集数据集到分片的映射。 查询路由器使用此元数据将操作定向到特定分片。

数据使用特定键(称为分片键)在多个节点间分布。 MongoDB 将分片键值划分为各个区块,并在群集中的节点间均匀地分布区块。 分片键可以基于哈希或基于范围。 在基于哈希的分片中,分片键的哈希值用于将文档分配给特定区块。 在基于范围的分片中,将每个区块分配给特定范围的分片键值,随后可以将文档分配给特定块区。

MongoDB 允许管理员使用标记感知分片来定向平衡策略。 管理员创建标记并将它们与分片键的范围相关联,然后将这些标记分配给分片。 均衡器随后将标记的数据迁移到适当的分片,并确保群集始终强制实施标记所描述的数据分布。

MongoDB 用例

MongoDB 可用于满足某些类型的应用程序面临的特定挑战:

  • 迅速发展的大型数据集:MongoDB 支持大量数据,具有非常灵活的无架构设计。 对于快速发展并且需要不断变化的架构的应用程序,MongoDB 可能是一个不错的选择。

  • 基于位置的数据:MongoDB 的独特之处在于能够以有效的方法存储和索引地理空间数据。 出于此原因,MongoDB 非常广泛地用于使用地理空间或地图数据的应用程序。 (示例包括预订应用程序、基于位置的服务等)

  • 具有高写入负载的应用程序:MongoDB 提供对大容量插入的内置支持,并支持高插入速率,同时与 RDBMS 相比,具有宽松事务安全性。

  • 不可靠环境中的高可用性:MongoDB 的体系结构允许在配置复制时几乎即时地从节点故障中自动恢复。 这在不可靠环境中尤其有用。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号