MongoDB是一个基于分布式文件存储的开源NoSQL数据库,主要用于大规模文档存储。下面是一些必须了解的核心概念、命令及其解析:
1. 数据库、集合和文档
- 数据库:MongoDB的顶级组织单元,一个MongoDB实例可以承载多个数据库。
- 集合:位于数据库内的一个组织单元,类似于关系型数据库中的表,但没有固定的结构。
- 文档:一个JSON格式的数据记录,类似于关系型数据库中的行。
# 创建/切换数据库
use mydb
# 在当前数据库中创建集合
db.createCollection("mycollection")
# 向集合中插入文档
db.mycollection.insert({name: "Alice", age: 25, address: "123 Street"})
2. CRUD操作
- Create:创建文档。
- Read:读取文档。
- Update:更新文档。
- Delete:删除文档。
# 插入文档
db.mycollection.insert({name: "Bob", age: 30})
# 查询文档
db.mycollection.find({age: {$gt: 25}})
# 更新文档
db.mycollection.update({name: "Alice"}, {$set: {age: 26}})
# 删除文档
db.mycollection.remove({name: "Bob"})
3. 索引
索引用于提高数据库查询性能。MongoDB中,可以为集合中的一个或多个字段创建索引。
# 为name字段创建索引
db.mycollection.createIndex({name: 1})
4. 聚合
MongoDB提供了强大的聚合框架,用于对数据进行各种形式的处理,如分组、过滤、排序等。
# 按age字段分组,并计算每个年龄的人数
db.mycollection.aggregate([{ $group: {_id: "$age", count: {$sum: 1}}}])
5. 备份与恢复
定期备份是维护数据库安全的重要手段,MongoDB提供了mongodump
和mongorestore
工具进行备份和恢复。
# 备份数据库
mongodump --db mydb --out /path/to/backup
# 恢复数据库
mongorestore --db mydb /path/to/backup/mydb
6. 安全性
在生产环境中,需要对MongoDB进行适当的安全配置,包括网络隔离、认证授权等。
# 创建管理员用户
use admin
db.createUser({user: "admin", pwd: "adminpassword", roles: ["root"]})
# 启用认证
# 编辑mongod.conf,加入 security: authorization: enabled
# 重启MongoDB服务
这些是MongoDB的基本概念和操作,但MongoDB还有很多高级功能和优化技术,例如:
1. 分片(Sharding)
分片是MongoDB中用于处理大规模数据集的一种方法,通过将数据分布在多个服务器上,可以实现横向的扩展。
设置分片:
# 启动配置服务器 (configsvr)
mongod --configsvr --dbpath /path/to/configdb --port 27019
# 启动分片服务器 (shardsvr)
mongod --shardsvr --dbpath /path/to/sharddb --port 27020
# 启动mongos
mongos --configdb configsvr:27019
添加分片:
# 连接mongos
mongo --host mongos-hostname --port 27017
# 添加分片
sh.addShard("shardsvr:27020")
2. 复制集(Replica Set)
复制集提供数据冗余和高可用性,通过将数据复制到多个服务器,可以在主服务器出现故障时自动切换到备用服务器。
配置复制集:
# 启动MongoDB实例,指定复制集名称
mongod --dbpath /path/to/db --replSet "rs0" --port 27017
# 初始化复制集
mongo --eval "rs.initiate()"
3. 事务处理
MongoDB 4.0及更高版本支持多文档ACID事务,这使得在一个事务中对多个文档进行更改成为可能。
// 开启一个Session
let session = db.getMongo().startSession()
// 开启一个事务
session.startTransaction()
try {
// 执行事务内的操作
session.getDatabase("mydb").mycollection.insertOne({ name: "Alice" })
session.getDatabase("mydb").mycollection.updateOne({ name: "Bob" }, { $set: { age: 30 } })
// 提交事务
session.commitTransaction()
} catch (error) {
// 出现错误,回滚事务
session.abortTransaction()
throw error
} finally {
// 结束Session
session.endSession()
}
4. 性能调优
- 索引优化:合理创建和使用索引是提高查询性能的关键。
- 查询优化:使用投影来减少返回的数据量,使用
$explain
来分析查询计划。 - 写入优化:批量写入可以提高写入性能,写入关注级别(write concern)可以影响写入的耐久性和一致性。
5. 数据迁移
使用mongodump
和mongorestore
工具可以实现数据的备份和恢复,也可以用于数据的迁移。
6. 故障恢复
在服务器故障时,如果配置了复制集,MongoDB可以自动进行故障切换。在数据错误或丢失时,可以使用备份来恢复数据。
7. 监控和日志分析
使用MongoDB自带的监控工具,如mongostat
和mongotop
,以及第三方监控工具,如Prometheus
和Grafana
,来监控数据库的性能和资源使用情况。定期分析MongoDB的日志,以发现潜在的问题和性能瓶颈。
在实际应用中,需要根据具体的业务需求和系统环境,灵活选择和应用这些技术。