MongoDB面试题
MongoDB基础知识
概述与特性
- 什么是MongoDB?它的主要特点是什么?
- MongoDB是关系型数据库还是非关系型数据库?
- MongoDB和传统关系型数据库的区别?
- MongoDB的应用场景有哪些?
- 你们使用的MongoDB版本是什么?为什么选择这个版本?
- MongoDB的优缺点是什么?
基本概念
- MongoDB中的数据库、集合、文档的概念?
- 什么是BSON?和JSON的区别?
- MongoDB的_id字段是什么?有什么特点?
- ObjectId的组成部分是什么?
- MongoDB支持哪些数据类型?
安装与配置
- MongoDB的安装方式有哪些?
- MongoDB的默认端口是多少?
- MongoDB的配置文件主要包含哪些内容?
- 如何启动和停止MongoDB服务?
- MongoDB的存储引擎有哪些?默认是什么?
- WiredTiger存储引擎的特点?
数据操作
CRUD操作
- 如何插入文档?insertOne和insertMany的区别?
- 如何查询文档?find()方法的使用?
- 如何更新文档?update、updateOne、updateMany的区别?
- 如何删除文档?deleteOne和deleteMany的区别?
- 什么是upsert操作?
- 如何进行批量操作?
查询操作
- MongoDB的查询操作符有哪些?($eq、$gt、$lt、$in等)
- 如何进行正则表达式查询?
- 如何查询嵌套文档?
- 如何查询数组字段?
- 如何进行分页查询?skip和limit的性能问题?
索引管理
索引基础
- MongoDB支持哪些类型的索引?
- 如何创建索引?createIndex的参数?
- 什么是复合索引?索引顺序的影响?
- 什么是稀疏索引?使用场景?
- 什么是TTL索引?如何实现数据过期?
- 唯一索引和主键索引的区别?
索引优化
- 如何查看查询是否使用了索引?explain()的使用?
- 索引的选择原则是什么?
- 如何分析索引的使用情况?
- 索引对写入性能的影响?
- 如何优化索引?
- 什么是索引覆盖查询?
特殊索引
- 什么是文本索引?如何进行全文搜索?
- 什么是地理空间索引?2d和2dsphere的区别?
- 什么是哈希索引?使用场景?
- 部分索引(Partial Index)是什么?
- 如何创建后台索引?
副本集(Replica Set)
副本集概念
- 什么是MongoDB副本集?作用是什么?
- 副本集的成员类型有哪些?(Primary、Secondary、Arbiter)
- 主节点和从节点的职责是什么?
- 什么是仲裁节点?为什么需要仲裁节点?
- 副本集最少需要几个节点?为什么?
- 副本集和主从复制的区别?
副本集配置
- 如何搭建副本集?具体步骤?
- 如何添加和删除副本集成员?
- 如何查看副本集状态?rs.status()
- 如何修改副本集配置?
- 什么是优先级?如何设置?
- 如何强制主节点切换?
副本集原理
- 副本集的选举机制是怎样的?
- 什么是oplog?作用是什么?
- 副本集的同步原理?
- 什么是读偏好(Read Preference)?有哪些模式?
- 什么是写关注(Write Concern)?如何保证数据一致性?
- 副本集的故障转移过程?
分片集群(Sharding)
分片概念
- 什么是MongoDB分片?为什么需要分片?
- 分片集群的组件有哪些?(mongos、config server、shard)
- 各组件的作用是什么?
- 什么是分片键(Shard Key)?如何选择?
- 什么是chunk?默认大小是多少?
- 分片策略有哪些?(范围分片、哈希分片)
分片配置
- 如何搭建分片集群?
- 如何添加分片?
- 如何对集合进行分片?
- 如何查看分片状态?
- 如何进行分片的负载均衡?
- 如何移除分片?
分片管理
- 什么是balancer?作用是什么?
- 如何监控chunk的分布?
- 如何手动迁移chunk?
- 分片键一旦选定能否修改?
- 如何处理热点数据问题?
- 分片集群的限制有哪些?
备份与恢复
备份策略
- MongoDB的备份方式有哪些?
- mongodump和mongorestore的使用?
- 如何进行物理备份?
- 如何进行增量备份?
- 如何备份分片集群?
- 备份时需要注意什么?
数据恢复
- 如何使用mongorestore恢复数据?
- 如何恢复到指定时间点?
- 如何恢复单个集合?
- 如何处理恢复时的冲突?
- 分片集群的恢复流程?
备份工具
- MongoDB官方备份工具有哪些?
- 第三方备份工具了解吗?
- 如何实现自动化备份?
- 云环境下的备份方案?
- 备份文件的管理策略?
性能优化
查询优化
- 如何优化MongoDB查询性能?
- 慢查询如何定位?Profiler的使用?
- 如何分析查询执行计划?
- 如何优化聚合查询?
- 如何避免全表扫描?
- 查询优化的最佳实践?
写入优化
- 如何提高写入性能?
- 批量操作的优化?
- Write Concern对性能的影响?
- 如何优化更新操作?
- 如何处理热点写入?
硬件优化
- MongoDB对硬件的要求?
- 内存配置建议?
- 磁盘I/O优化?
- 网络优化建议?
- CPU资源分配?
架构优化
- 读写分离如何实现?
- 如何设计高可用架构?
- 如何进行容量规划?
- 垂直扩展vs水平扩展?
- 缓存策略的应用?
监控与运维
监控指标
- MongoDB需要监控哪些关键指标?
- 如何监控内存使用情况?
- 如何监控磁盘I/O?
- 如何监控复制延迟?
- 如何监控连接数?
- 如何监控锁等待?
监控工具
- MongoDB自带的监控命令有哪些?
- mongostat和mongotop的使用?
- MongoDB Compass的功能?
- 第三方监控工具有哪些?
- 如何集成Prometheus监控?
- 如何设置告警?
日志管理
- MongoDB的日志类型有哪些?
- 如何配置日志级别?
- 如何分析MongoDB日志?
- 如何进行日志轮转?
- 审计日志如何配置?
运维管理
- 如何进行版本升级?
- 如何进行数据迁移?
- 如何进行容量扩展?
- 如何处理磁盘空间不足?
- 定期维护任务有哪些?
安全管理
认证授权
- MongoDB的认证机制有哪些?
- 如何启用认证?
- 如何创建用户和分配权限?
- 内置角色有哪些?
- 如何自定义角色?
- 如何实现细粒度权限控制?
加密安全
- MongoDB支持哪些加密方式?
- 如何启用传输加密(TLS/SSL)?
安全加固
- MongoDB安全加固的措施有哪些?
- 如何限制网络访问?
- 如何防止注入攻击?
- 如何配置防火墙规则?
- 安全审计如何实现?
问题排查
常见问题
- MongoDB启动失败的常见原因?
- 连接MongoDB失败如何排查?
- 查询超时如何处理?
- 内存占用过高如何排查?
- 磁盘空间满了如何处理?
性能问题
- 数据库响应慢如何排查?
- CPU使用率高如何分析?
- 锁等待问题如何解决?
- 复制延迟如何处理?
- 分片不均衡如何解决?
数据问题
- 数据不一致如何排查?
- 数据丢失如何恢复?
- 索引损坏如何修复?
- 文档过大如何处理?
- 孤儿文档如何清理?
集群问题
- 副本集选举失败如何处理?
- 分片集群config server故障如何恢复?
- mongos路由错误如何排查?
- 网络分区问题如何解决?
- 节点同步卡住如何处理?
最佳实践
设计原则
- MongoDB数据模型设计原则?
- 什么时候使用嵌入文档vs引用?
- 如何设计高效的索引?
- 分片键选择的最佳实践?
- 文档大小的建议?
开发建议
- 连接池如何配置?
- 如何处理MongoDB的事务?
- 如何实现乐观锁?
- 批量操作的建议?
- 错误处理最佳实践?
运维建议
- 生产环境部署建议?
- 备份恢复策略建议?
- 监控告警配置建议?
- 容量规划建议?
- 升级迁移建议?
更新时间:2025-01-30