• MongoDB学习大纲


    MongoDB是一个基于分布式文件存储的开源NoSQL数据库,主要用于大规模文档存储。下面是一些必须了解的核心概念、命令及其解析:

    1. 数据库、集合和文档

    • 数据库:MongoDB的顶级组织单元,一个MongoDB实例可以承载多个数据库。
    • 集合:位于数据库内的一个组织单元,类似于关系型数据库中的表,但没有固定的结构。
    • 文档:一个JSON格式的数据记录,类似于关系型数据库中的行。
    # 创建/切换数据库
    use mydb
    
    # 在当前数据库中创建集合
    db.createCollection("mycollection")
    
    # 向集合中插入文档
    db.mycollection.insert({name: "Alice", age: 25, address: "123 Street"})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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"})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3. 索引

    索引用于提高数据库查询性能。MongoDB中,可以为集合中的一个或多个字段创建索引。

    # 为name字段创建索引
    db.mycollection.createIndex({name: 1})
    
    • 1
    • 2

    4. 聚合

    MongoDB提供了强大的聚合框架,用于对数据进行各种形式的处理,如分组、过滤、排序等。

    # 按age字段分组,并计算每个年龄的人数
    db.mycollection.aggregate([{ $group: {_id: "$age", count: {$sum: 1}}}])
    
    • 1
    • 2

    5. 备份与恢复

    定期备份是维护数据库安全的重要手段,MongoDB提供了mongodumpmongorestore工具进行备份和恢复。

    # 备份数据库
    mongodump --db mydb --out /path/to/backup
    
    # 恢复数据库
    mongorestore --db mydb /path/to/backup/mydb
    
    • 1
    • 2
    • 3
    • 4
    • 5

    6. 安全性

    在生产环境中,需要对MongoDB进行适当的安全配置,包括网络隔离、认证授权等。

    # 创建管理员用户
    use admin
    db.createUser({user: "admin", pwd: "adminpassword", roles: ["root"]})
    
    # 启用认证
    # 编辑mongod.conf,加入 security: authorization: enabled
    # 重启MongoDB服务
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这些是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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    添加分片:

    # 连接mongos
    mongo --host mongos-hostname --port 27017
    
    # 添加分片
    sh.addShard("shardsvr:27020")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 复制集(Replica Set)

    复制集提供数据冗余和高可用性,通过将数据复制到多个服务器,可以在主服务器出现故障时自动切换到备用服务器。

    配置复制集:

    # 启动MongoDB实例,指定复制集名称
    mongod --dbpath /path/to/db --replSet "rs0" --port 27017
    
    # 初始化复制集
    mongo --eval "rs.initiate()"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    4. 性能调优

    • 索引优化:合理创建和使用索引是提高查询性能的关键。
    • 查询优化:使用投影来减少返回的数据量,使用$explain来分析查询计划。
    • 写入优化:批量写入可以提高写入性能,写入关注级别(write concern)可以影响写入的耐久性和一致性。

    5. 数据迁移

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

    6. 故障恢复

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

    7. 监控和日志分析

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

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

  • 相关阅读:
    好好回答下 TCP 和 UDP 的区别
    进程属性/进程状态
    微信小程序使用echarts/数据刷新重新渲染/图层遮挡问题
    小波神经网络的基本原理,小波神经网络训练过程
    C++:函数对象Functor(仿函数)与匿名函数对象(Lambda表达式)详细介绍以及底层实现。
    【 DetVisGUI_代码测试】目标检测结果可视化程序测试
    甘特图:项目管理的核心工具WBS
    java-net-php-python-45ssm校园小商品二手交易系统计算机毕业设计程序
    23届校招面经&内推
    Mac修改Mysql8.0密码
  • 原文地址:https://blog.csdn.net/m0_57021623/article/details/133253380