一、MongoDB 核心概念
MongoDB 是一个 面向文档的 NoSQL 数据库,与传统的关系型数据库(如 MySQL)相比,最大的区别是它以 文档(Document)为存储单元,而不是表和行。
1. 数据库(Database)
- MongoDB 中可以有多个数据库,每个数据库包含多个集合。
- 类似于关系型数据库中的“数据库”。
2. 集合(Collection)
- 集合是 MongoDB 中存储文档的容器,类似于关系型数据库中的“表”。
- 一个集合内可以存储多个文档(Document)。
3. 文档(Document)
文档是 MongoDB 的基本数据单元,以 BSON(Binary JSON) 格式存储。
每个文档是一个键值对结构,类似于 JSON 对象。
示例:
{ "_id": ObjectId("5f9d1b3b9c9d6e1d9c9d6e1d"), "name": "Alice", "age": 25, "hobbies": ["reading", "music"], "address": { "city": "Beijing", "zip": "100000" } }
4. ObjectId
- MongoDB 自动为每个文档生成一个唯一的
_id
字段,类型为ObjectId
。 - 它是一个 12 字节的唯一标识符,包含时间戳、机器标识、进程 ID 和随机数。
二、MongoDB 数据模型
1. 嵌套结构(Embedded Documents)
- MongoDB 支持嵌套文档结构,可以将复杂的数据结构直接嵌入到一个文档中。
- 例如:用户的地址信息可以直接嵌套在用户文档中,而不需要单独建表。
2. 数组(Arrays)
- 支持数组类型字段,用于存储多个值。
- 例如:用户可能有多个兴趣爱好,可以用数组存储。
3. 动态模式(Schema-less)
- MongoDB 的集合没有严格的 schema 限制,同一个集合中的文档可以有不同的字段结构。
- 这种灵活性非常适合处理半结构化或非结构化数据。
三、MongoDB 常用操作(Mongo Shell)
以下是一些 MongoDB 的基本操作命令,适用于 Mongo Shell(即 mongo
命令行工具)。
1. 连接数据库
mongo
2. 查看所有数据库
show dbs
3. 使用(创建)数据库
use mydb
4. 查看当前数据库的集合
show collections
5. 插入文档
db.users.insertOne({
name: "Alice",
age: 25,
hobbies: ["reading", "music"],
address: {
city: "Beijing",
zip: "100000"
}
})
6. 查询文档
db.users.find({ name: "Alice" })
7. 更新文档
db.users.updateOne(
{ name: "Alice" },
{ $set: { age: 26 } }
)
8. 删除文档
db.users.deleteOne({ name: "Alice" })
9. 创建索引
db.users.createIndex({ name: 1 }) // 1 表示升序,-1 表示降序
10. 聚合查询(Aggregation)
db.users.aggregate([
{ $match: { age: { $gt: 20 } } },
{ $group: { _id: null, avgAge: { $avg: "$age" } } }
])
四、MongoDB 的适用场景
MongoDB 的设计使其特别适合以下场景:
1. 灵活的数据结构
- 适用于数据结构频繁变化的场景,如日志系统、用户行为记录等。
2. 高扩展性需求
- 支持水平扩展(分片),适合处理大量数据和高并发访问。
3. 嵌套数据处理
- 适合需要嵌套结构的数据,如用户配置、产品信息、地理位置数据等。
4. 实时数据分析
- 通过聚合框架可以快速进行实时分析,如统计用户行为、日志分析等。
5. 内容管理系统
- 适合存储文章、评论、标签等内容,支持灵活的嵌套和扩展。
五、MongoDB 与其他数据库的对比
特性 | MongoDB(NoSQL) | MySQL(SQL) |
---|---|---|
数据结构 | 文档(JSON-like) | 表(Rows & Columns) |
查询语言 | MongoDB Query Language | SQL |
事务支持 | 从 4.0 开始支持多文档事务 | 原生支持 |
扩展性 | 水平扩展(分片) | 垂直扩展为主 |
索引支持 | 支持多种索引类型 | 支持基本索引 |
适用场景 | 半结构化数据、大数据 | 结构化数据、事务处理 |
六、MongoDB 的局限性
虽然 MongoDB 非常灵活,但也有一些局限性需要注意:
- 不支持复杂的 JOIN 操作:虽然可以通过
$lookup
实现类似功能,但性能不如 SQL。 - 事务支持有限:虽然支持多文档事务,但性能和使用场景受限。
- 数据一致性较弱:默认是最终一致性,适合对一致性要求不高的场景。
- 占用存储空间较大:由于存储的是 BSON,相比压缩后的二进制数据会更占空间。