1. MongoDB 基础
MongoDB 是一个开源、文档型的 NoSQL 数据库,广泛应用于大数据处理、实时分析以及动态变化的 Web 应用中。与传统的关系型数据库不同,MongoDB 存储数据为 BSON 格式(类似 JSON 格式),具有高可扩展性和高性能,非常适合用于处理大量非结构化和半结构化数据。MongoDB 支持丰富的查询、索引和聚合功能,是开发人员在构建 Web 应用时的首选数据库之一。
2. 数据模型与集合(Collections)
MongoDB 使用数据模型来表示数据结构。与关系型数据库中的表格不同,MongoDB 将数据存储为“集合”(Collections)。每个集合包含多个“文档”(Documents),类似于关系型数据库中的行。集合中的文档不需要有相同的结构,允许灵活存储不同类型的数据。
- 集合(Collection):相当于关系型数据库中的表(Table),但没有预定义的 Schema。
- 文档(Document):相当于关系型数据库中的行(Row),以 BSON 格式(类似 JSON)存储数据。
3. 文档(Documents)与 JSON 格式
MongoDB 使用 BSON 格式存储文档,BSON 是二进制格式的 JSON,因此它支持嵌套数据和灵活的数据结构。文档中的字段(Field)可以包含各种数据类型,如字符串、整数、日期、数组等。此外,MongoDB 允许嵌套文档和数组,这使得它能够高效地处理复杂的数据模型。
- 示例文档(Document):
{
"_id": ObjectId("60e7dbd6e8d5f74c8b0f27d3"),
"title": "MongoDB Basics",
"author": "John Doe",
"tags": ["database", "NoSQL"],
"content": "MongoDB is a NoSQL database.",
"date": ISODate("2021-07-14T00:00:00Z")
}
4. CRUD 操作:插入、查询、更新、删除
在 MongoDB 中,常用的数据库操作包括插入(Create)、查询(Read)、更新(Update)和删除(Delete)。MongoDB 提供了灵活的查询语言,允许开发者进行复杂的数据操作。
- 插入文档(Insert):
db.articles.insertOne({ title: "MongoDB Basics", author: "John Doe", tags: ["NoSQL"] });
- 查询文档(Find):
db.articles.find({ author: "John Doe" });
- 更新文档(Update):
db.articles.updateOne({ _id: ObjectId("60e7dbd6e8d5f74c8b0f27d3") }, { $set: { title: "MongoDB Advanced" } });
- 删除文档(Delete):
db.articles.deleteOne({ _id: ObjectId("60e7dbd6e8d5f74c8b0f27d3") });
5. 数据索引与性能优化
为了提高查询性能,MongoDB 支持对字段创建索引。索引在数据库中像书籍的目录一样,能够加速特定字段的查询。MongoDB 提供了多种索引类型,如单字段索引、复合索引、地理空间索引等。
- 创建索引:
db.articles.createIndex({ title: 1 }); // 创建单字段索引
- 性能优化:在数据量大、查询复杂时,适当使用索引可以显著提高查询效率。然而,过多的索引会影响写操作的性能,因此需要在性能和索引之间做出平衡。
6. MongoDB 数据库设计
1、数据建模与模式设计
MongoDB 是无模式(schema-less)的,这意味着每个文档可以有不同的字段。设计数据模型时,需根据实际应用需求选择合适的建模方式。主要的设计模式包括:
- 嵌套文档(Embedded Documents):适用于一对多关系,嵌套文档提高了数据访问的效率,但可能导致数据冗余。
- 引用(References):适用于多对多关系,可以避免数据冗余,但会增加查询复杂度。
2、嵌套文档与引用
- 嵌套文档:适用于相关数据一起存储,如用户和订单信息嵌套存储。
- 引用:适用于需要独立存储的多对多关系,如用户和文章之间的关系可以通过引用来实现。
7. 数据聚合:聚合管道(Aggregation Pipeline)
MongoDB 提供强大的数据聚合功能,可以对数据进行复杂的处理和分析。聚合管道(Aggregation Pipeline)允许用户按照一定的顺序执行一系列操作,如过滤、分组、排序和计算。常用的聚合操作包括 $match(过滤)、$group(分组)、$sort(排序)、$project(投影)等。
- 示例聚合操作:
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $group: { _id: "$product", total: { $sum: "$quantity" } } },
{ $sort: { total: -1 } }
]);
8. 数据一致性与事务支持
MongoDB 提供了灵活的数据一致性模型。在默认的情况下,MongoDB 使用最终一致性模型,但它也支持事务,以确保多文档操作的一致性。MongoDB 4.0 引入了多文档 ACID 事务,允许开发者在多个文档上执行原子操作。
- 开启事务:
const session = db.getMongo().startSession();
session.startTransaction();
try {
db.orders.updateOne({ _id: orderId }, { $set: { status: "paid" } });
db.products.updateOne({ _id: productId }, { $inc: { stock: -1 } });
session.commitTransaction();
} catch (error) {
session.abortTransaction();
}
9. 实践操作
1、安装与配置 MongoDB
- 在本地或云服务器上安装 MongoDB,可以参考官方文档进行安装和配置。
- 配置 MongoDB 实例,确保数据库的安全性和高可用性。
2、创建数据库与集合,执行 CRUD 操作
- 创建一个新的数据库和集合,并通过 MongoDB Shell 或 MongoDB Compass 执行 CRUD 操作,熟悉日常操作流程。
3、设计一个简单的博客系统
- 设计一个简单的博客系统,其中包含用户、文章和评论功能,理解如何使用 MongoDB 来存储与查询复杂的数据关系。
通过这一部分的学习,你将掌握 MongoDB 的基本操作、数据建模、聚合查询等核心功能,能够灵活使用 MongoDB 构建实际应用系统。