MongoDB学习大纲

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提供了mongodumpmongorestore工具进行备份和恢复。

# 备份数据库
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. 数据迁移

使用mongodumpmongorestore工具可以实现数据的备份和恢复,也可以用于数据的迁移。

6. 故障恢复

在服务器故障时,如果配置了复制集,MongoDB可以自动进行故障切换。在数据错误或丢失时,可以使用备份来恢复数据。

7. 监控和日志分析

使用MongoDB自带的监控工具,如mongostatmongotop,以及第三方监控工具,如PrometheusGrafana,来监控数据库的性能和资源使用情况。定期分析MongoDB的日志,以发现潜在的问题和性能瓶颈。

在实际应用中,需要根据具体的业务需求和系统环境,灵活选择和应用这些技术。

你可能感兴趣的:(运维,mongodb,学习,数据库)