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的日志,以发现潜在的问题和性能瓶颈。
在实际应用中,需要根据具体的业务需求和系统环境,灵活选择和应用这些技术。