简介:MongoDB 是一个基于分布式文件存储的数据库,属于 NoSQL 数据库产品,以下是其知识框架总结:
一、数据模型
- 文档:MongoDB 中的数据以 BSON(二进制形式的 JSON)格式存储在集合中,文档类似于关系型数据库中的行,但结构更灵活。
- 集合:是文档的容器,类似于关系型数据库中的表,但集合中的文档不需要有相同的字段结构。
- 数据库:多个集合组成一个数据库,一个 MongoDB 实例可以包含多个数据库。
二、数据库操作
- 创建数据库:使用
use
命令,若数据库不存在则会在插入数据时自动创建。 - 查看数据库:使用
show dbs
命令列出所有数据库。 - 删除数据库:使用
db.dropDatabase()
方法删除当前数据库。
三、集合操作
- 创建集合:使用
db.createCollection('集合名')
创建集合。 - 查看集合:使用
show collections
命令查看当前数据库中的所有集合。 - 删除集合:使用
db.集合名.drop()
方法删除指定集合。
四、文档操作
- 插入文档:使用
db.集合名.insertOne({字段:值})
插入单个文档,db.集合名.insertMany([{文档1},{文档2}])
插入多个文档。 - 查询文档:使用
db.集合名.find({查询条件})
查询文档,支持多种查询操作符,如$eq
(等于)、$gt
(大于)、$in
(包含)等。 - 更新文档:使用
db.集合名.updateOne({查询条件}, {$set:{字段:新值}})
更新单个文档,db.集合名.updateMany()
更新多个文档。 - 删除文档:使用
db.集合名.deleteOne({查询条件})
删除单个文档,db.集合名.deleteMany({查询条件})
删除多个文档。
五、索引
- 创建索引:使用
db.集合名.createIndex({字段:1})
创建升序索引,{字段:-1}
创建降序索引,还支持复合索引、文本索引等。 - 查看索引:使用
db.集合名.getIndexes()
查看集合的索引信息。 - 删除索引:使用
db.集合名.dropIndex({索引名:1})
删除指定索引,db.集合名.dropIndexes()
删除所有索引。
六、聚合操作
- 聚合管道:使用
db.集合名.aggregate([{阶段1},{阶段2}])
进行聚合操作,常见的聚合阶段有$match
(筛选)、$group
(分组)、$project
(投影)等。
七、副本集
- 概念:是一组 MongoDB 实例,其中一个为主节点,其余为从节点,用于数据冗余和高可用性。
- 配置:需要在每个节点的配置文件中设置相关参数,并使用
rs.initiate()
初始化副本集。
八、分片集群
- 概念:将数据分散存储在多个服务器上,以提高存储和查询性能。
- 组件:包括分片服务器(Shard)、配置服务器(Config Server)和路由服务器(Mongos)。
九、性能优化
1、索引优化
- 合理创建索引:根据查询条件创建复合索引、唯一索引等,避免全表扫描。
- 避免冗余索引:定期使用
db.collection.getIndexes()
检查并删除无用索引。 - 索引覆盖查询:确保查询的字段都在索引中,减少文档扫描。
2、查询优化
- 避免大查询:使用分页(
limit
和skip
)处理大量数据,避免一次性返回过多结果。 - 优化聚合管道:在管道开头使用
$match
尽早过滤数据,减少后续阶段的处理量。
3、内存管理
- WiredTiger 存储引擎:调整
wiredTigerCacheSizeGB
参数,通常设置为系统内存的 50%。 - 监控内存使用:通过
db.serverStatus().wiredTiger.cache
查看缓存命中率。
4、分片与副本集
- 分片策略:选择合适的分片键(如哈希分片、范围分片),避免数据倾斜。
- 读写分离:在副本集从节点上处理读请求,减轻主节点压力。
5、硬件与存储
- 使用 SSD:提升 I/O 性能,尤其是写入密集型工作负载。
- 禁用交换空间:避免内存交换导致的性能骤降。
十、安全配置
1、认证与授权
- 启用身份验证:在配置文件中设置
security.authorization: "enabled"
,创建管理员用户。 - 基于角色的访问控制(RBAC):为不同用户分配不同角色(如
readWrite
、dbAdmin
),使用db.createUser()
创建用户。
2、网络安全
- 绑定 IP 地址:在配置文件中设置
net.bindIp: 127.0.0.1
或指定允许访问的 IP。 - 使用防火墙:限制 MongoDB 端口(默认 27017)的访问,仅允许授权 IP 连接。
- 启用 TLS/SSL:配置证书实现加密通信,设置
net.ssl.mode: requireSSL
。
3、数据加密
- 静态数据加密:使用 MongoDB Enterprise 版本的加密功能或操作系统级加密(如 LUKS)。
- 传输加密:通过 SSL/TLS 加密客户端与服务器之间的通信。
4、审计与监控
- 启用审计日志:配置
auditLog
参数记录关键操作(如用户认证、敏感命令)。 - 定期安全审计:检查用户权限、网络配置和日志,识别潜在风险。
5、版本更新与漏洞修复
- 及时更新 MongoDB:修复已知安全漏洞,建议使用 LTS 版本。
6、敏感操作限制
- 禁用危险命令:如
$where
操作符,防止 JavaScript 注入攻击。 - 限制 MongoDB 进程权限:运行 MongoDB 服务的用户应仅拥有必要的系统权限