MongoDB Beginner Guide 01:理解 NoSQL、文档模型与 Python 开发环境

前言

初学者在使用 Python 操作 MongoDB 时,经常会遇到一个容易混淆的问题:

复制代码
pip install pymongo

安装这条命令对应的 Python 包后,程序仍然可能无法连接 MongoDB。

原因是 PyMongo 和 MongoDB Server 并不是同一个工具。

组件 作用
MongoDB Server 负责运行数据库、存储数据和处理查询
PyMongo 负责让 Python 程序与 MongoDB 通信
MongoDB Shell 通过命令行操作 MongoDB
MongoDB Compass 通过图形界面管理 MongoDB

它们之间的关系可以简单理解为:

复制代码
Python 程序
    ↓
PyMongo
    ↓
MongoDB Server
    ↓
Database

因此,安装 PyMongo 只代表 Python 环境中具备了 MongoDB 驱动,并不代表计算机已经安装或启动 MongoDB 数据库服务。

本文将从 NoSQL、文档模型、BSON 和 MongoDB 核心组件开始,整理 MongoDB 的基础知识。


1. 什么是 MongoDB?

MongoDB 是一种基于文档模型的 NoSQL 数据库。

传统关系型数据库通常通过表、行和列组织数据,而 MongoDB 使用 Document,也就是文档,保存一条完整的数据记录。

例如,下面是一条虚构的商品数据:

复制代码
{
    product_code: "ITEM-001",
    product_name: "Sample Keyboard",
    price: 129,
    available: true
}

这条数据包含四个字段:

|----------------|---------------------|
| 字段 | 示例值 |
| product_code | "ITEM-001" |
| product_name | "Sample Keyboard" |
| price | 129 |
| available | true |

MongoDB 文档的结构与 JSON 对象相似,因此比较容易与 Python 字典、JavaScript 对象以及 Web API 返回的数据对应。

对应的 Python 字典可以写成:

复制代码
sample_product = {
    "product_code": "ITEM-001",
    "product_name": "Sample Keyboard",
    "price": 129,
    "available": True
}

这也是 MongoDB 经常被用于 Web 应用、数据采集、日志记录和内容管理系统的原因之一。


2. 什么是 NoSQL?

NoSQL 通常可以理解为 Not Only SQL,即"不仅仅是 SQL"。

它并不是指数据库完全不需要查询语言,也不代表 NoSQL 一定比关系型数据库更先进。

NoSQL 是一类没有将传统关系表作为唯一数据模型的数据库系统。

常见的 NoSQL 数据库类型包括:

|-------|-------------------|
| 类型 | 数据组织方式 |
| 文档数据库 | 使用 Document 保存数据 |
| 键值数据库 | 使用 Key-Value 保存数据 |
| 列族数据库 | 按列族组织数据 |
| 图数据库 | 使用节点和关系组织数据 |

MongoDB 属于文档数据库。

传统关系型数据库通常具有以下特点:

  • 提前定义表结构;

  • 明确每个字段的数据类型;

  • 使用行和列组织数据;

  • 使用主键和外键建立关系;

  • 使用 SQL 完成查询。

MongoDB 则主要具有以下特点:

  • 使用 Document 保存记录;

  • 支持数组和嵌套文档;

  • 文档结构可以根据需求调整;

  • 使用 MongoDB 查询语法操作数据;

  • 可以通过验证规则约束文档结构。

需要注意,MongoDB 的灵活结构并不代表项目完全不需要设计数据结构。

在正式项目中,仍然需要统一:

  • 字段名称;

  • 字段类型;

  • 时间格式;

  • 嵌套层级;

  • 缺失值规则;

  • 唯一标识方式。

否则,过度自由的数据结构反而会增加后续查询、维护和清洗的难度。


3. MongoDB 使用的 BSON 是什么?

MongoDB 文档看起来与 JSON 很相似,但 MongoDB 实际使用的是 BSON。

BSON 可以理解为一种二进制形式的数据表示格式。它在 JSON 风格结构的基础上支持更多数据类型。

常见类型包括:

|----------|-----------------|
| 类型 | 说明 |
| String | 字符串 |
| Integer | 整数 |
| Double | 浮点数 |
| Boolean | 布尔值 |
| Date | 日期时间 |
| ObjectId | MongoDB 常用的唯一标识 |
| Array | 数组 |
| Object | 嵌套文档 |
| Null | 空值 |

例如,下面是一条虚构的任务记录:

复制代码
{
    task_code: "TASK-001",
    title: "Database Practice",
    completed: false,
    priority: 2,
    tags: [
        "database",
        "beginner"
    ]
}

其中包含:

  • 字符串;

  • 布尔值;

  • 整数;

  • 数组。

MongoDB 还可以保存嵌套文档:

复制代码
{
    task_code: "TASK-002",
    title: "Document Model Practice",
    configuration: {
        language: "en",
        difficulty: "basic"
    }
}

在这个例子中,configuration 字段本身又是一个文档。


4. MongoDB 与关系型数据库的结构对比

关系型数据库通常按照以下层次组织数据:

复制代码
Database
    ↓
Table
    ↓
Row
    ↓
Column

MongoDB 通常按照以下层次组织数据:

复制代码
Database
    ↓
Collection
    ↓
Document
    ↓
Field

两者可以进行如下类比:

|----------|--------------|
| 关系型数据库 | MongoDB |
| Database | Database |
| Table | Collection |
| Row | Document |
| Column | Field |
| 表结构 | 文档结构 |
| SQL | MongoDB 查询语法 |

这种对应关系只适合帮助初学者理解概念,并不代表两种数据库的所有功能完全一致。

关系型数据库中的同一张表通常具有统一的列结构。

MongoDB 同一个 Collection 中的不同 Document 可以包含不同字段。

例如,第一条虚构设备记录为:

复制代码
{
    device_code: "DEVICE-001",
    device_type: "sensor",
    status: "active"
}

第二条记录可以增加其他字段:

复制代码
{
    device_code: "DEVICE-002",
    device_type: "terminal",
    status: "inactive",
    protocols: [
        "HTTP",
        "MQTT"
    ]
}

第二条 Document 比第一条多了 protocols 字段。

这体现了 MongoDB 文档结构的灵活性。


5. MySQL 与 MongoDB 的数据表示方式

假设需要保存一组虚构的产品数据。

5.1 MySQL 的表示方式

在 MySQL 中,可以先创建一张数据表:

复制代码
CREATE TABLE products (
    id INT PRIMARY KEY,
    product_code VARCHAR(50),
    product_name VARCHAR(100),
    price DECIMAL(10, 2)
);

数据按照固定列保存:

|----|--------------|-----------------|--------|
| id | product_code | product_name | price |
| 1 | ITEM-001 | Sample Keyboard | 129.00 |
| 2 | ITEM-002 | Sample Mouse | 59.00 |

如果需要增加新的信息,通常需要修改表结构或建立其他关联表。

5.2 MongoDB 的表示方式

在 MongoDB 中,一条产品记录可以表示为:

复制代码
{
    product_code: "ITEM-001",
    product_name: "Sample Keyboard",
    price: 129
}

另一条产品记录可以包含更多信息:

复制代码
{
    product_code: "ITEM-002",
    product_name: "Sample Mouse",
    price: 59,
    tags: [
        "office",
        "computer"
    ],
    specification: {
        connection: "wireless",
        interface: "USB"
    }
}

MongoDB 可以在一个 Document 中直接保存:

  • 普通字段;

  • 数组;

  • 嵌套文档。

不过,是否应该把所有内容都放入一个 Document,需要根据实际查询方式和数据规模决定。


6. MongoDB 的核心概念

6.1 Database

Database 是 MongoDB 中较高层级的数据容器。

一个 MongoDB 实例可以包含多个 Database。

例如,可以创建一个虚构数据库:

复制代码
sample_store

该数据库可以保存产品、订单和日志等不同数据。

6.2 Collection

Collection 是一组 Document 的集合,可以暂时类比为关系型数据库中的 Table。

例如:

复制代码
products

这个 Collection 可以用于保存产品 Document。

6.3 Document

Document 是 MongoDB 中的一条记录。

例如:

复制代码
{
    product_code: "ITEM-003",
    product_name: "Sample Monitor",
    price: 899
}

6.4 Field

Field 是 Document 中的字段。

在上面的示例中,包含以下字段:

复制代码
product_code
product_name
price

6.5 _id

MongoDB Collection 中的每条 Document 都需要一个唯一的 _id 字段。

如果插入数据时没有主动提供 _id,MongoDB 通常会自动生成一个 ObjectId。

示例:

复制代码
{
    _id: ObjectId("..."),
    product_code: "ITEM-003",
    product_name: "Sample Monitor"
}

_id 用于唯一识别一条 Document。

在公开技术文章中,不应直接展示真实业务数据库中的完整 _id、账号、服务器地址或连接凭证。


7. MongoDB 适合哪些场景?

MongoDB 可以用于多种应用场景,但是否选择 MongoDB,仍然需要结合数据结构、查询方式和业务要求判断。

7.1 Web API 数据

许多 Web API 返回的数据本身就是 JSON 结构。

例如:

复制代码
{
    record_code: "RECORD-001",
    category: "demo",
    value: 86,
    valid: true
}

MongoDB 的文档模型可以比较自然地保存这类数据。

7.2 网络数据采集

不同页面或接口返回的数据字段可能并不完全一致。

例如:

复制代码
{
    item_code: "ITEM-101",
    title: "Sample Product A",
    price: 99
}

另一条记录可能多出促销信息:

复制代码
{
    item_code: "ITEM-102",
    title: "Sample Product B",
    price: 149,
    promotion: {
        enabled: true,
        discount: 0.9
    }
}

MongoDB 可以保存这种包含嵌套对象和可变字段的数据。

不过,在写入数据库之前,仍然建议完成:

  • 字段标准化;

  • 数据类型转换;

  • 重复记录检查;

  • 缺失值处理;

  • 无效内容清理。

7.3 日志和事件数据

应用程序可能产生大量事件记录。

例如:

复制代码
{
    event_code: "EVENT-001",
    event_type: "page_view",
    page_code: "PAGE-001",
    response_status: 200
}

日志字段可能随着系统功能变化而增加,MongoDB 的文档模型可以适应一定程度的字段变化。

7.4 内容管理系统

文章、标签、分类等数据经常包含数组或嵌套结构。

例如:

复制代码
{
    article_code: "ARTICLE-001",
    title: "Sample Technical Note",
    tags: [
        "database",
        "beginner"
    ],
    metadata: {
        language: "en",
        status: "draft"
    }
}

7.5 数据与 AI 应用

数据应用可能需要保存:

  • 文本记录;

  • 模型输出;

  • 任务状态;

  • 特征信息;

  • 处理日志。

例如:

复制代码
{
    job_code: "JOB-001",
    model_name: "demo_classifier",
    input_type: "text",
    predicted_label: "category_a",
    confidence: 0.87,
    status: "completed"
}

MongoDB 可以作为应用系统的数据存储层之一。


8. MongoDB 的主要组件

8.1 MongoDB Server

MongoDB Server 是真正运行数据库的服务。

它负责:

  • 接收客户端连接;

  • 保存数据;

  • 查询数据;

  • 修改数据;

  • 管理索引;

  • 处理数据库请求。

其核心服务程序通常称为:

复制代码
mongod

如果 MongoDB Server 没有安装或运行,其他客户端工具通常无法连接本地数据库。

8.2 MongoDB Shell

MongoDB Shell 的名称是:

复制代码
mongosh

它是 MongoDB 的命令行客户端,可以用于:

  • 连接数据库;

  • 查看 Database;

  • 查看 Collection;

  • 查询 Document;

  • 插入和修改数据;

  • 执行管理命令。

具体的 MongoDB Shell 和 CRUD 操作可以放在后续文章中单独整理。

8.3 MongoDB Compass

MongoDB Compass 是 MongoDB 官方提供的图形化客户端。

它可以用于:

  • 浏览 Database;

  • 查看 Collection;

  • 查看 Document;

  • 设置查询条件;

  • 修改数据;

  • 管理索引。

Compass 只是数据库客户端,真正保存数据的仍然是 MongoDB Server。

8.4 PyMongo

PyMongo 是 MongoDB 的 Python 驱动。

Python 程序可以通过 PyMongo:

  • 连接 MongoDB;

  • 选择 Database;

  • 选择 Collection;

  • 插入 Document;

  • 查询数据;

  • 更新和删除数据。

PyMongo 不负责运行数据库服务。


9. MongoDB Server、Shell、Compass 和 PyMongo 的关系

四个组件之间的关系可以概括为:

复制代码
MongoDB Shell ──────┐
                    │
MongoDB Compass ────┼──→ MongoDB Server ───→ Database
                    │
Python + PyMongo ───┘

|-----------------|-----------|------------|
| 组件 | 类型 | 是否负责真正存储数据 |
| MongoDB Server | 数据库服务 | 是 |
| MongoDB Shell | 命令行客户端 | 否 |
| MongoDB Compass | 图形化客户端 | 否 |
| PyMongo | Python 驱动 | 否 |

因此:

复制代码
安装 PyMongo
≠
安装 MongoDB Server

同样:

复制代码
安装 MongoDB Compass
≠
MongoDB Server 已经启动

Shell、Compass 和 PyMongo 都需要连接到一个可用的 MongoDB Server。


10. 为什么安装 PyMongo 后仍然无法连接?

安装:

复制代码
pip install pymongo

只会把 MongoDB Python 驱动安装到当前 Python 环境。

它不会自动完成以下操作:

  • 安装 MongoDB Server;

  • 启动数据库服务;

  • 创建数据库用户;

  • 配置服务器端口;

  • 创建数据库和 Collection。

因此,需要分别准备:

复制代码
Python 环境
└── PyMongo

数据库环境
└── MongoDB Server

本地学习环境常用的连接地址形式为:

复制代码
mongodb://localhost:27017

其中,27017 是 MongoDB 常见的默认端口。

公开发布文章时,不应展示真实生产环境的:

  • IP 地址;

  • 数据库用户名;

  • 数据库密码;

  • 完整连接字符串;

  • 内网域名;

  • 访问令牌;

  • 云数据库凭证。

公开示例可以统一使用:

复制代码
mongodb://localhost:27017

或者:

复制代码
mongodb://<host>:<port>

11. MongoDB Community Server 与其他工具

个人学习和本地开发通常可以使用 MongoDB Community Server。

学习过程中可能涉及:

|--------------------------|-----------|
| 工具 | 说明 |
| MongoDB Community Server | 本地数据库服务 |
| MongoDB Shell | 命令行客户端 |
| MongoDB Compass | 图形化管理工具 |
| PyMongo | Python 驱动 |

需要注意,不同 MongoDB 版本和安装方式包含的组件可能有所不同。

例如,安装 MongoDB Server 后,不一定代表当前系统已经安装 mongosh

因此,安装时应根据当前 MongoDB 版本和操作系统查看官方说明。


12. 安装完成后需要确认什么?

完成 MongoDB 环境安装后,可以依次检查以下内容。

12.1 MongoDB Server 是否已安装

需要确认系统中安装的是数据库服务,而不仅仅是 Compass 或 PyMongo。

12.2 数据库服务是否正在运行

数据库已经安装,不代表服务当前一定处于运行状态。

如果服务停止,客户端无法正常建立连接。

12.3 MongoDB Shell 是否可用

如果准备使用命令行操作 MongoDB,需要确认 mongosh 已正确安装。

12.4 Compass 是否可以连接数据库

Compass 需要连接到可用的 MongoDB Server。

如果 Server 没有运行,Compass 也无法正常显示数据库内容。

12.5 Python 环境是否已安装 PyMongo

MongoDB Server 与 Python 环境相互独立。

即使数据库服务已经运行,如果 Python 环境没有安装 PyMongo,程序仍然无法导入 MongoDB 驱动。


13. MongoDB 是否一定比关系型数据库更适合数据采集?

不一定。

MongoDB 比较适合以下情况:

  • 数据接近 JSON 结构;

  • 数据包含数组或嵌套对象;

  • 不同来源的字段可能变化;

  • 需要快速保存原始记录;

  • 应用主要以 Document 为单位读取数据。

关系型数据库可能更适合以下情况:

  • 数据结构长期稳定;

  • 不同数据表之间关系明确;

  • 需要复杂关联查询;

  • 强调严格约束;

  • 需要成熟的关系型分析流程。

部分系统也会组合使用多种存储方式:

复制代码
原始数据
    ↓
MongoDB 或对象存储
    ↓
数据清洗
    ↓
关系型数据库或数据仓库
    ↓
分析与建模

数据库选择应该基于实际需求,而不是简单判断哪种数据库更加高级。


14. 初学者容易混淆的问题

14.1 MongoDB 是不是没有 Schema?

不是。

MongoDB 使用灵活的文档结构,但正式项目仍然需要设计核心字段和数据类型。

MongoDB 也支持通过验证规则限制文档结构。

14.2 BSON 和 JSON 是否完全相同?

不是。

MongoDB 文档看起来与 JSON 相似,但实际使用 BSON,并支持 ObjectId、Date 等额外数据类型。

14.3 Compass 是否就是 MongoDB?

不是。

Compass 是图形化客户端,MongoDB Server 才是真正运行和存储数据的数据库服务。

14.4 安装 PyMongo 是否会自动启动 MongoDB?

不会。

PyMongo 只负责 Python 与 MongoDB 之间的通信。

14.5 MongoDB 是否只能保存非结构化数据?

不是。

MongoDB 可以保存结构化和半结构化数据。

更准确的说法是,MongoDB 使用由字段、数组和嵌套文档组成的灵活文档模型。


15. 后续学习路线

建议按照以下顺序学习 MongoDB。

第一阶段:基础概念

主要包括:

  • NoSQL;

  • Document Model;

  • BSON;

  • Database;

  • Collection;

  • Document;

  • Field;

  • MongoDB 主要组件。

第二阶段:MongoDB Shell 与 CRUD

主要包括:

  • 连接 MongoDB Shell;

  • 创建和切换 Database;

  • Collection 操作;

  • Create;

  • Read;

  • Update;

  • Delete;

  • 查询运算符。

第三阶段:Python 与 PyMongo

主要包括:

  • 使用 Python 连接 MongoDB;

  • 插入单条和多条 Document;

  • 查询 MongoDB 数据;

  • 异常处理;

  • 批量写入;

  • 将数据转换为 Pandas DataFrame。


总结

MongoDB 是一种基于文档模型的 NoSQL 数据库。

其基本数据层次为:

复制代码
Database
    ↓
Collection
    ↓
Document
    ↓
Field

MongoDB 使用类似 JSON 的文档结构,并通过 BSON 支持字符串、数字、数组、嵌套文档、日期和 ObjectId 等数据类型。

对于初学者,最重要的是区分以下四个组件:

复制代码
MongoDB Server:真正运行和存储数据

MongoDB Shell:命令行客户端

MongoDB Compass:图形化客户端

PyMongo:Python 驱动

因此:

复制代码
pip install pymongo

只代表安装了 Python 驱动,并不代表 MongoDB Server 已经安装或启动。

理解这些基础概念后,再学习 MongoDB Shell、CRUD 和 PyMongo,会更容易建立完整的知识体系。

相关推荐
Database_Cool_1 小时前
AI Agent 长期记忆怎么存?阿里云 PolarDB-X 对接 Mem0 记忆框架实践
数据库·阿里云
会编程的土豆1 小时前
数据库范式
数据库·oracle
L1624761 小时前
MySQL 全环境生产快速安装 + 完整配置手册(整合国产银河麒麟适配 + 主从补充版)
数据库·mysql
yio_yin1 小时前
Spring事务管理(数据一致性)
数据库·sql·spring
前端世界2 小时前
MySQL 基础入门(学习第4天)——约束与 DML 操作详解
数据库·学习·mysql
小李不困还能学3 小时前
基于 51 单片机的8 路抢答器设计教程
单片机·嵌入式硬件·mongodb·抢答器
nianniannnn3 小时前
Qt QMessageBox知识点
开发语言·数据库·qt
—Miss. Z—3 小时前
计算机二级MySQL——简单应用题(存储过程&存储函数)
数据库·oracle·php
Vect__4 小时前
MySQL 数据类型和约束:从字段设计到表结构建模
数据库·mysql