MongoDB简介

MongoDB是一个开源的NoSQL数据库,采用文档存储方式,使用BSON(Binary JSON)格式存储数据。它具有以下特点:

  • 面向文档的存储:数据以JSON-like的文档形式存储
  • 灵活的模式:不需要预定义表结构
  • 高可扩展性:支持水平扩展
  • 丰富的查询语言:支持复杂的查询操作
  • 支持索引:提高查询性能
  • 支持复制和故障转移:保证高可用性
  • 支持分片:处理大规模数据

基本概念

关系型数据库 MongoDB
数据库(Database) 数据库(Database)
表(Table) 集合(Collection)
行(Row) 文档(Document)
列(Column) 字段(Field)
索引(Index) 索引(Index)
主键(Primary Key) _id字段

常用命令

数据库操作

1
2
3
4
5
6
7
8
9
10
11
# 查看所有数据库
show dbs

# 切换到指定数据库(如果不存在则创建)
use mydb

# 查看当前数据库
db

# 删除当前数据库
db.dropDatabase()

集合操作

1
2
3
4
5
6
7
8
# 创建集合
db.createCollection("users")

# 查看所有集合
show collections

# 删除集合
db.users.drop()

文档操作

插入文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 插入单个文档
db.users.insertOne({
name: "John",
age: 30,
email: "john@example.com",
address: {
street: "123 Main St",
city: "New York"
},
hobbies: ["reading", "hiking", "coding"]
})

# 插入多个文档
db.users.insertMany([
{ name: "Alice", age: 25, email: "alice@example.com" },
{ name: "Bob", age: 35, email: "bob@example.com" }
])

查询文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 查询所有文档
db.users.find()

# 条件查询
db.users.find({ age: { $gt: 25 } })

# 投影查询(只返回指定字段)
db.users.find({ age: { $gt: 25 } }, { name: 1, email: 1, _id: 0 })

# 排序
db.users.find().sort({ age: 1 }) # 升序
db.users.find().sort({ age: -1 }) # 降序

# 限制结果数量
db.users.find().limit(5)

# 跳过指定数量的结果
db.users.find().skip(5)

# 聚合查询
db.users.aggregate([
{ $match: { age: { $gt: 25 } } },
{ $group: { _id: "$age", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
])

更新文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 更新单个文档
db.users.updateOne(
{ name: "John" },
{ $set: { age: 31, email: "john.doe@example.com" } }
)

# 更新多个文档
db.users.updateMany(
{ age: { $lt: 30 } },
{ $set: { status: "young" } }
)

# 替换文档
db.users.replaceOne(
{ name: "John" },
{ name: "John Doe", age: 31, email: "john.doe@example.com" }
)

删除文档

1
2
3
4
5
# 删除单个文档
db.users.deleteOne({ name: "John" })

# 删除多个文档
db.users.deleteMany({ age: { $lt: 25 } })

索引操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建单字段索引
db.users.createIndex({ name: 1 })

# 创建复合索引
db.users.createIndex({ name: 1, age: -1 })

# 创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true })

# 查看集合的索引
db.users.getIndexes()

# 删除索引
db.users.dropIndex({ name: 1 })

高级功能

复制集(Replica Set)

复制集是一组维护相同数据集的MongoDB实例,提供冗余和高可用性。

分片集群(Sharded Cluster)

分片集群将数据分布在多个服务器上,支持水平扩展。

GridFS

GridFS用于存储和检索超过BSON文档大小限制(16MB)的文件。

性能优化

  1. 使用索引:为常用查询字段创建索引
  2. 合理设计模式:根据查询模式设计文档结构
  3. 使用聚合管道:减少客户端数据处理
  4. 批量操作:使用批量插入和更新
  5. 监控性能:使用mongostat和mongotop监控性能
  6. 适当的硬件配置:足够的内存和IOPS

备份与恢复

备份

1
2
3
4
5
# 使用mongodump备份
time mongodump --host localhost --port 27017 --db mydb --out /backup

# 备份单个集合
time mongodump --host localhost --port 27017 --db mydb --collection users --out /backup

恢复

1
2
3
4
5
# 使用mongorestore恢复
time mongorestore --host localhost --port 27017 --db mydb /backup/mydb

# 恢复单个集合
time mongorestore --host localhost --port 27017 --db mydb --collection users /backup/mydb/users.bson

安全配置

  1. 启用认证:设置用户名和密码
  2. 限制网络访问:使用防火墙限制访问
  3. 使用TLS/SSL:加密数据传输
  4. 定期更新:保持MongoDB版本更新
  5. 审计日志:启用审计功能

常见问题解决

  1. 连接数过多:调整maxConnections参数
  2. 内存使用过高:合理设置WiredTiger缓存大小
  3. 索引碎片:定期重建索引
  4. 写入性能问题:使用批量写入和适当的索引

学习资源

官方文档

教程资源

  1. MongoDB基础教程
  2. MongoDB安装指南
  3. MongoDB增删查改操作
  4. MongoDB索引优化
  5. MongoDB复制集配置
  6. MongoDB分片集群
  7. MongoDB备份与恢复

工具

总结

MongoDB是一个功能强大的NoSQL数据库,适用于各种应用场景,从简单的Web应用到复杂的企业级系统。通过合理的设计和优化,可以充分发挥MongoDB的优势,构建高性能、可扩展的应用系统。