学习 MongoDB:完整的初学者指南 – wiki基地

学习 MongoDB:完整的初学者指南

在当今数据驱动的世界中,数据库是任何应用程序的核心。在众多数据库类型中,NoSQL 数据库因其灵活性、可扩展性和高性能而变得越来越受欢迎。其中,MongoDB 作为领先的 NoSQL 数据库之一,以其文档模型和强大的功能吸引了无数开发者。

本指南将带你从零开始,全面了解 MongoDB,包括其核心概念、安装、基本操作以及数据建模的最佳实践,助你轻松迈入 MongoDB 的世界。

什么是 MongoDB?

MongoDB 是一个开源的 NoSQL 文档数据库,以其灵活的数据模型而闻名。与传统的关系型数据库(如 SQL)将数据存储在表格中不同,MongoDB 以 BSON(Binary JSON)格式的文档存储数据,这些文档类似于 JSON 对象。这种方式使得它能够轻松处理非结构化和半结构化数据,非常适合现代应用程序的快速迭代开发。

MongoDB 的核心特性:

  • 面向文档: 数据以文档形式存储,每个文档都是一个键值对的集合,类似于 JSON 对象。
  • 灵活的模式(Schema-less): 同一集合中的文档可以拥有不同的字段、结构和大小,这意味着你无需预定义严格的表结构。
  • 高可用性: 通过副本集(Replica Sets)实现数据冗余和自动故障转移,确保数据始终可用。
  • 水平扩展: 利用分片(Sharding)技术,可以将大量数据分布到多台服务器上,以应对海量数据和高并发需求。
  • 强大的查询语言: 支持丰富的查询操作,包括范围查询、正则表达式查询以及聚合管道等高级数据处理功能。

MongoDB 核心概念

在深入学习之前,了解 MongoDB 的基本术语至关重要:

  • 文档(Document): MongoDB 的基本数据单元,一个键值对的集合。可以将其理解为关系型数据库中的一行记录,但更为灵活。
    json
    {
    "name": "Laptop",
    "price": 1200,
    "category": "Electronics"
    }
  • 集合(Collection): 文档的逻辑分组。类似于关系型数据库中的表,但集合不强制执行模式,这意味着一个集合中的文档可以有不同的结构。
  • 数据库(Database): 多个集合的物理容器。一个 MongoDB 实例可以承载多个数据库。
  • BSON: MongoDB 内部存储文档的二进制 JSON 格式。它扩展了 JSON,增加了额外的数据类型(如日期、二进制数据)。
  • 索引(Indexes): 提高查询效率的关键。类似于书籍的目录,索引允许 MongoDB 快速定位数据而无需扫描整个集合。
  • 副本集(Replica Sets): 用于实现高可用性和数据冗余的机制。它由一组 MongoDB 实例组成,其中一个为主节点(Primary),负责处理所有写入操作,其他为从节点(Secondaries),复制主节点的数据。
  • 分片(Sharding): 用于处理大规模数据集和高吞吐量的横向扩展方法。它将数据分散存储在多个服务器上,每个服务器只存储数据的一个子集。

MongoDB 安装

MongoDB Community Server 支持多种操作系统。以下是主要平台的安装概述:

1. 下载 MongoDB Community Server

访问 MongoDB 官方网站下载页面,选择适合你操作系统的最新稳定版 Community Server。

2. 操作系统特定安装步骤

Windows:

  1. 运行下载的 .msi 安装程序。
  2. 选择“完整”安装,并在安装过程中勾选“将 MongoDB 安装为服务”。
  3. 可以选择安装 MongoDB Compass(一个图形用户界面工具)。
  4. 安装完成后,确保 C:\data\db 目录存在,如果不存在,手动创建。
  5. 在 PowerShell 或命令提示符中输入 net start MongoDB 启动 MongoDB 服务。
  6. 将 MongoDB 的 bin 目录(例如 C:\Program Files\MongoDB\Server\{版本号}\bin)添加到系统 PATH 环境变量中。
  7. 打开新的终端,输入 mongosh 即可连接到 MongoDB shell。

macOS (使用 Homebrew):

  1. 打开终端。
  2. 如果未安装 Homebrew,请先安装 Homebrew。
  3. 运行 brew tap mongodb/brew 添加 MongoDB 的 Homebrew Tap。
  4. 执行 brew install mongodb-community 安装 MongoDB。
  5. 通过 brew services start mongodb-community 启动 MongoDB 服务。
  6. 在终端中输入 mongosh 连接到 MongoDB shell。

Linux (Ubuntu/Debian):

  1. 打开终端。
  2. 导入 MongoDB APT 仓库的公共 GPG 密钥。
  3. 将 MongoDB 仓库添加到你的系统源列表。
  4. 更新软件包列表:sudo apt update
  5. 安装 MongoDB:sudo apt install -y mongodb-org
  6. 启动 MongoDB 服务:sudo systemctl start mongod
  7. 设置 MongoDB 开机自启:sudo systemctl enable mongod
  8. 在终端中输入 mongosh 连接到 MongoDB shell。

MongoDB CRUD 操作

CRUD 代表创建(Create)、读取(Read)、更新(Update)和删除(Delete),是与数据库交互的四项基本操作。

1. 创建(Insert)文档

向集合中添加新文档。如果集合不存在,MongoDB 会在第一次插入时自动创建它。

  • 插入单个文档:db.collection.insertOne()
    javascript
    db.products.insertOne({
    name: "Laptop",
    price: 1200,
    category: "Electronics",
    details: {
    brand: "ABC",
    weight: "2kg"
    }
    });
  • 插入多个文档:db.collection.insertMany()
    javascript
    db.products.insertMany([
    { name: "Keyboard", price: 75, category: "Accessories" },
    { name: "Mouse", price: 25, category: "Accessories" }
    ]);

2. 读取(Query)文档

从集合中检索文档。

  • 查找所有文档:db.collection.find({})
    javascript
    db.products.find({}); // 返回 products 集合中的所有文档
  • 根据条件查找文档:db.collection.find({ <query> })
    “`javascript
    // 查找 category 为 ‘Electronics’ 的产品
    db.products.find({ category: “Electronics” });

    // 查找价格大于 100 的产品
    db.products.find({ price: { $gt: 100 } }); // $gt 表示大于
    * **查找单个文档:`db.collection.findOne({ <query> })`**javascript
    // 查找 name 为 ‘Laptop’ 的单个产品
    db.products.findOne({ name: “Laptop” });
    * **投影(Projection):选择返回的字段**javascript
    // 只返回 name 和 price 字段,并排除默认的 _id 字段
    db.products.find({}, { name: 1, price: 1, _id: 0 });
    “`

3. 更新(Update)文档

修改集合中现有的文档。

  • 更新单个文档:db.collection.updateOne({ <filter> }, { <update_operations> })
    javascript
    // 更新 name 为 'Laptop' 的产品的价格
    db.products.updateOne(
    { name: "Laptop" },
    { $set: { price: 1250 } } // $set 操作符用于设置字段值
    );
  • 更新多个文档:db.collection.updateMany({ <filter> }, { <update_operations> })
    javascript
    // 将 category 为 'Accessories' 的所有产品的价格提高 10%
    db.products.updateMany(
    { category: "Accessories" },
    { $mul: { price: 1.1 } } // $mul 操作符用于乘法更新
    );
  • 替换单个文档:db.collection.replaceOne({ <filter> }, { <new_document> })
    javascript
    // 替换 name 为 'Mouse' 的文档
    db.products.replaceOne(
    { name: "Mouse" },
    { name: "Gaming Mouse", price: 50, manufacturer: "XYZ" }
    );

4. 删除(Delete)文档

从集合中移除文档。

  • 删除单个文档:db.collection.deleteOne({ <filter> })
    javascript
    // 删除 name 为 'Gaming Mouse' 的文档
    db.products.deleteOne({ name: "Gaming Mouse" });
  • 删除多个文档:db.collection.deleteMany({ <filter> })
    javascript
    // 删除所有 category 为 'Accessories' 的文档
    db.products.deleteMany({ category: "Accessories" });

MongoDB 数据建模

数据建模在 MongoDB 中至关重要,它直接影响应用程序的性能和可维护性。由于其灵活的模式,正确地设计数据结构能够最大限度地发挥 MongoDB 的优势。

核心原则:

  • 将共同访问的数据存储在一起: 如果数据经常一起被查询,那么将它们嵌入到同一个文档中通常是最佳选择,以减少查询次数。
  • 针对应用程序的访问模式进行优化: 你的数据模型应该根据应用程序如何查询和使用数据来设计。

数据建模技术:

  1. 嵌入(Embedding / Denormalization):
    将相关的子文档直接嵌套在父文档中。适用于:

    • 一对一或一对少关系: 当子文档与父文档紧密相关且数量不多时。
    • 频繁一起读取的数据: 嵌入可以减少查询次数,提高读取性能。
    • 示例: 将用户的地址信息直接嵌入到用户文档中。
      json
      {
      "_id": ObjectId("..."),
      "name": "Alice",
      "email": "[email protected]",
      "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "zip": "12345"
      }
      }
  2. 引用(Referencing / Normalization):
    通过存储其他文档的 _id 来建立文档之间的关联。适用于:

    • 一对多或多对多关系: 当关联的数据量较大或需要独立更新时。
    • 不经常一起读取的数据: 可以避免文档过大。
    • 示例: 用户文档引用多个订单文档的 _id
      “`json
      // User 文档
      {
      “_id”: ObjectId(“user123”),
      “name”: “Bob”,
      “email”: “[email protected]”,
      “orders”: [
      ObjectId(“orderA1”),
      ObjectId(“orderB2”)
      ]
      }

      // Order 文档
      {
      “_id”: ObjectId(“orderA1”),
      “item”: “Product X”,
      “quantity”: 1
      }
      “`

  3. 混合方法:
    结合嵌入和引用的优点,根据具体场景进行混合设计。例如,可以嵌入一些经常需要的信息,同时引用其他更详细或不常用的信息。

数据建模最佳实践:

  • 规划并迭代: 尽管 MongoDB 模式灵活,但早期规划数据结构仍然很重要。随着项目发展,逐步迭代和优化模型。
  • 明智地使用索引: 在经常查询、排序或用于过滤的字段上创建索引,以提高查询速度。
  • 避免过度嵌套: 尽管嵌入很强大,但过深的嵌套(例如超过 3 层)会使查询复杂化并可能影响性能。
  • 文档大小限制: MongoDB 的单个文档大小限制为 16MB。确保你的嵌入文档不会超出此限制。
  • 考虑数据一致性: 决定是通过应用程序逻辑还是 MongoDB 的模式验证规则来强制执行数据一致性。
  • 为读密集型应用去范式化,为写密集型应用范式化: 如果你的应用程序读取数据远多于写入数据,去范式化(嵌入)可以提高读取性能。如果更新频繁,范式化(引用)可能更好。

总结

MongoDB 凭借其灵活的文档模型、高可用性和可扩展性,成为了现代应用程序开发的强大工具。通过本指南的学习,你现在应该对 MongoDB 的核心概念、安装过程、基本 CRUD 操作以及数据建模策略有了全面的了解。

从这里开始,你可以尝试构建自己的应用程序,使用 MongoDB 存储和管理数据,并通过实践进一步掌握这个强大的 NoSQL 数据库!

滚动至顶部