发布于 2026-01-06 1 阅读
0

MongoDB 简化教程 第一部分:是什么、为什么以及如何使用?

MongoDB 简化教程 第一部分:是什么、为什么以及如何使用?

这是“MongoDB入门指南”系列文章的第一篇,将涵盖MongoDB的所有基础知识。我会尽量用最简单的方式来讲解。

我们将从了解什么是 MongoDB?是如何工作的?的优缺点是什么?如何在你的机器上进行配置?一直到学习如何执行基本的 CRUD 操作。如果你好奇的话,CRUD 是创建(Create)、读取(Read)、更新(Update)和删除(Delete)的缩写。那么,让我们开始吧。

MongoDB是什么?

MongoDB 是一个基于文档模型的数据库,它是一种非关系型数据库。

那么,关系型数据库和非关系型数据库分别是什么呢?🤔

假设关系数据库管理系统(RDBMS)就像一个“Excel 表格”,它有列,用于以表格的形式保存数据。每个表格都有一个唯一的 ID 来标识每一行,并且每一列都分布着多个字段。这类数据库通常彼此之间存在关系,因此得名“关系数据库” 💡。

MongoDB (数据库管理系统)将数据以类似 JSON 的文档形式保存在集合中,这些文档与其他文档之间没有任何关联因此被称为“非关系型数据库”。JSON对象示例如下所示👇🏼:

{
    "id": "123",
    "name": "Shad Mirza",
    "hobbies": "Coding, Art, Writing"
}

它是如何运作的?

MongoDB 中的记录就是一个文档。那么,什么是文档呢?🤔

文档是一种由字段和值对组成的数据结构。MongoDB 文档类似于JSON 对象 (参见上面的示例),但它使用一种称为BSON(二进制 JSON)的变体,可以容纳更多数据类型。这些文档是单独插入的,彼此之间互不感知。(记住,这是非关系型数据库。)

这意味着记录的列数不必相同(这是关系数据库管理系统中的必须条件)。

例如:一个集合Employees可以包含多个文档,每个文档employee可以有不同的号码对数量,key-value例如,一个员工可以有一个电话号码,而另一个员工可以有两个电话号码,这完全没问题。

{
    "id": "101",
    "name": "Ramesh",
    "personalNumber": "9123456789"
},
{
    "id": "102",
    "name": "Suresh",
    "personalNumber": "9123456788",
    "workNumber": "8123456789",
}

现在假设我们使用的是关系型数据库,那么我们必然会为每组数据使用相同数量的列。

在当前示例中,这意味着我们需要workNumber为所有员工添加一列,无论他们是否需要此字段。这将导致“Ramesh”在workNumber该列中出现空值😓。

不受列的限制,开发人员可以随意添加文档,而不用担心稍作更改就会破坏一切🤩。

MongoDB允许您以计算机易于处理人类易于阅读的方式构建数据,从而为整个应用程序提供存储和处理数据的自然方式。

MongoDB 是一个分布式数据库,这意味着它提供了三个基本功能,开发者需要自行实现这些功能。正因如此,它深受开发者社区的喜爱。这三个功能是:

  • 容错性:MongoDB允许数据拥有多个副本,因此即使某个服务器发生故障,其他服务器也能继续提供数据。单个服务器故障不会影响应用程序,因为始终有多个副本可供依赖。它采用单主架构来保证数据一致性,辅助数据库则维护主数据库的副本。
  • 可扩展性: MongoDB 可以跨多个服务器扩展以存储和处理数据。因此,随着数据量和性能的增长,您只需添加更多服务器,而无需升级大型机。
  • 数据可用性:您可以将数据传输到全球各地,以获得更快的处理速度。

了解 NoSQL 和 SQL

关于 SQL 与 NoSQL 孰优孰劣的争论已经爆发了无数次战争⚔️,但答案始终如一:“视情况而定”

让我们从基础说起。数据库的专属用途是什么? 🤔

“存储数据”对吧?现在,让我们在这个背景下了解一下 SQL 数据库和 NoSQL 数据库之间的区别,以及它们如何存储数据。

SQL

  • 结构:tables SQL 以包含rows和的形式存储数据columns。它结构良好,并且由于 SQL 是关系型数据库,因此不同表之间通常存在一些关系(主键、外键等)
  • 速度:由于这些关系和*定义良好的*结构,SQL避免了数据重复,并且在连接、查询、更新等操作上速度相对较快。听起来不错吧?但是等等……
  • 灵活性:这也意味着您需要提前规划结构,任何更改都会很困难(记住关系?表是相互连接的。您不能只更改一个而不考虑另一个)。
  • 大数据:由于需要在多个位置应用更改,并且数据被拆分成多个逻辑表(我们稍后会详细介绍),因此需要对多个表执行各种读取操作才能获取所需数据。大数据要求数据读写查询速度尽可能快,因此 SQL 可能并非最佳选择。尽管 SQL 数据库在大规模部署中仍然适用,因为……
  • 社区: SQL 是一项成熟的技术,它已经存在很长时间了,有很多经验丰富的开发人员非常了解它。这意味着您可以获得强大的支持,如果您遇到任何问题,肯定能找到帮助。此外,您还可以轻松找到许多独立顾问,他们可以帮助您部署大规模 SQL 数据库。
  • 可扩展性: SQL 数据库几乎在所有情况下都具有可扩展性vertically scalable。这意味着您可以通过增加内存、CPU 或 SSD 等资源来提高单个服务器的负载。它非常强大,并且已被证明可以处理几乎任何情况。它遵循ACID特性(原子性、一致性、隔离性和持久性)。

例子

员工表格:

员工编号 员工姓名 数字 工作编号 地址
1 沙德 9988776655 9876543210 121
2 瓦姆西 8877665544 无效的 122
3 吉里什 7766554433 无效的 123

地址表:

地址 ID 城市 国家 邮政编码
121 瓦拉纳西 印度 221000
122 德里 印度 212345
123 胡布利 印度 564635

🧐 这个例子中有几点需要注意:

  1. FOREIGN KEY这两个表通过列中的键相互关联address。该键可用作 ID 来引用地址表。
  2. SQL 遵循一定的结构,因此work_number无论我们是否需要(对于特定行),该列都是必需的(请查看第二行和第三行的空值)。
  3. 要读取有关员工的信息,我们必须查询employee表,然后再address查询表,或者我们必须先将这两个表连接起来,然后获取数据。

NoSQL

  • 结构: NoSQL 数据库以文档模型的形式,将数据存储在类似 JSON 的对象中,这些对象包含key-value键值对。NoSQL 数据库没有标准模式定义,集合之间也没有关联。您可以将数据块合并在一起,而无需拆分它们。
  • 速度:正因如此,您可以一次性插入和检索所有数据。此外,NoSQL 数据库专为非结构化数据而设计。特定的数据实体存储在一起,而不是进行分区。因此,与 SQL 数据库相比,NoSQL 数据库对单个数据实体执行读取或写入操作的速度更快。
  • 灵活性:动态模式允许 MySQL 数据库根据用户需求进行更改。它们彼此独立,因此您无需担心在添加新内容时会破坏现有系统。
  • 大数据:由于模式灵活且读写查询速度更快,NoSQL 最适合大数据应用。
  • 社区: NoSQL 相对较新,支持力度不如 SQL,但发展速度很快。此外,能够搭建和部署大规模 NoSQL 系统的外部专家也比较有限。
  • 可扩展性: NoSQL 数据库具有良好的可扩展性horizontally scalable。这意味着可以通过添加更多服务器来处理更多流量。NoSQL 数据库遵循Brewers CAP 定理(一致性、可用性和分区容错性),但最新版本也引入了 ACID 特性。

例子

{
    "_id": "1",
    "employeeName": "Shad",
    "number": "9988776655",
    "workNumber": "9876543210",
    "address": {
        "city": "Varanasi",
        "country": "India",
        "pincode": "221000"
    },
},
{
    "_id": "2",
    "employeeName": "Vamsi",
    "number": "8877665544",
    "address": {
        "city": "Delhi",
        "country": "India",
        "pincode": "212345"
    },
},
{
    "_id": "3",
    "employeeName": "Girish",
    "number": "7766554433",
    "address": {
        "city": "hubli",
        "country": "India",
        "pincode": "564635"
    },
    "techStack": [
        {
            "_id": "565",
            "tech": "React",
            "experience": "3 Years",
        },
        {
            "_id": "867",
            "tech": "MobX",
            "experience": "2 Years",
        },
    ]
},

🧐 这个例子中有几点需要注意:

  1. 集合中不同对象之间没有关联。我们可以随意添加新的key-value对象对。(在 SQL 中添加新列时,我们需要处理之前添加的所有行,这些行对于新添加的字段将被赋值为 null。)
  2. 集合不需要包含特定数量的值。第二个和第三个对象不需要值workNumber,所以我们根本不保存它们,也不包含空值。
  3. 我们最终需要一次性获取所有用户信息(包括),我们可以将它们一起保存address,从而通过一次 API 调用轻松获取这些信息
  4. 将 JSON 数据当作对象来存储,可以让我们更轻松地存储复杂的结构。例如,我们最后一条记录就把“techStack”存储在一个对象数组里😵。这种灵活性在需要快速搭建原型时非常实用。

优点和缺点

MongoDB并非关系型数据库的替代品,而是一种替代方案。两者各有优缺点,我们必须了解何时使用哪种数据库。

现在我们要明确一下“视情况而定”的争论。让我们来分析一下利弊,以便更好地理解这个问题。

优点🥳

  • 数据存储在单个JSON对象中,插入和检索都很容易。
  • 无需存储NULL值:每个 JSON 对象都是独立的。
  • 灵活的模式:假设您想在 Person 表中添加一列。在 SQL 数据库中添加新数据需要进行一些更改,例如回填数据、修改模式等。这意味着所有已插入的值都会受到影响。但在 NoSQL 中,由于无需任何预先步骤,您可以轻松插入新数据。旧集合并不知道新的 JSON 对象,因此您可以立即开始添加新字段。
  • 为规模化而构建:NoSQL 数据库严格遵循 Brewers CAP 定理(一致性、可用性和分区容错性)。
  • 专为数据聚合而设计:我们可以收集平均工资、最高年龄等智能数据。

缺点😓

  • 如果您要执行大量更新操作(例如,先执行 DELETE 再执行 INSERT),则这不是一个好的选择。
  • NoSQL 的设计初衷是可扩展性,这意味着你可以高效地存储大量数据,但它并不适合复杂的查询。当然,你可以使用 NoSQL 来处理繁重的事务。然而,它并非最佳选择。(MongoDB 最近发布了 4.2.0 新版本,承诺提供安全的事务,因此这一点未来可能会得到解决,让我们拭目以待。)
  • JOIN 操作比较复杂。如果要从两个不同的集合中获取匹配的数据,则必须手动合并和检索数据。而 SQL(由于表之间的关系)内置了对 JOIN 的支持。
  • SQL 是一项成熟的技术,这意味着它值得信赖,已被广泛应用于各种场景,并拥有庞大的社区支持。如果您遇到问题,很可能能够找到解决方案;而 NoSQL 则相对较新。

本文到此结束,希望对您有所帮助。下一部分,我们将学习如何在本地机器上安装 MongoDB 并开始使用它。在那之前,请保重 👋,戴好口罩,祝您编程愉快!😋

Shad

文章来源:https://dev.to/iamshadmirza/mongodb-simplified-part-1-what-why-and-how-47dl