非常实用的问题 👍——MongoDB 报错种类很多,但大致可以分为以下几类:
连接类 / 权限类 / 语法类 / 存储类 / 聚合类 / 副本集类 / 性能资源类
下面我帮你系统梳理 MongoDB 常见报错 + 原因分析 + 解决方案,覆盖开发和运维中最常见的坑 👇
🧱 一、连接与认证类错误
报错信息 | 原因分析 | 解决方案 |
---|
Authentication failed. | 用户名/密码错误,或连接的数据库不是用户所在的认证库 | 检查用户名、密码、认证数据库:mongo -u user -p --authenticationDatabase admin |
MongoNetworkError: connect ECONNREFUSED | 连接被拒绝:MongoDB 没有启动或端口错误 | 检查 MongoDB 是否运行、端口是否正确(默认 27017) |
MongoTimeoutError: Server selection timed out | 无法找到可用服务器节点(防火墙、DNS 或副本集配置问题) | 确认 IP 白名单、网络连通、副本集节点状态 |
No suitable servers found | 副本集未初始化或节点不可达 | 使用 rs.status() 检查副本集健康;确认 replicaSet 参数 |
SSL handshake failed | 使用 SSL/TLS 连接时证书错误或配置不一致 | 检查证书文件路径、加密算法兼容性 |
socket exception [CONNECT_ERROR] | Mongo 服务未启动、被防火墙拦截 | 检查防火墙规则和 Mongo 服务状态 |
🔐 二、权限与认证相关
报错 | 说明 | 解决方案 |
---|
not authorized on db to execute command | 当前用户无权限执行操作 | 给用户分配相应角色:db.grantRolesToUser("user", [{role:"readWrite", db:"mydb"}]) |
Unauthorized: command insert requires authentication | 未认证连接直接执行命令 | 连接前加上 -u -p --authenticationDatabase admin |
Error: couldn't add user: not authorized | 创建用户时权限不足 | 必须以 admin 库管理员身份创建 |
SCRAM authentication failed | SCRAM-SHA-1/SHA-256 认证失败 | 确认 Mongo 版本与驱动支持的机制一致 |
📜 三、语法与类型错误
报错 | 原因 | 解决方法 |
---|
Unrecognized pipeline stage name: '$group' | 聚合管道语法错误或 Mongo 版本过低 | 检查 MongoDB 版本是否支持该阶段 |
Unrecognized expression '$dateDiff' | 版本低于 5.0,不支持 $dateDiff | 升级 MongoDB ≥ 5.0 |
Cannot apply $add to a value of non-numeric type | $add 操作字段类型不对 | 确认字段是数字或用 $toInt 转换 |
unknown top level operator: $orderby | $orderby 已废弃 | 改用 .sort() 或 $sort |
E11000 duplicate key error collection: ... | 唯一索引冲突(主键或 unique 索引重复) | 检查 _id 或唯一字段值,修改或删除重复项 |
💾 四、存储与磁盘类错误
报错 | 原因 | 解决方案 |
---|
WriteConflict | 多事务写同一文档冲突 | 重试事务或加锁 |
No space left on device | 磁盘满了 | 清理日志、扩容磁盘 |
Exceeded memory limit for $group | 聚合管道使用内存超过 100MB 限制 | 添加 allowDiskUse: true |
Data too large for key | 索引键大小超过 1024 字节 | 缩短字段内容或用哈希索引 |
BSONObj size: xxxx is invalid | 文档超出 16MB 限制 | 拆分文档或存 GridFS |
🔄 五、副本集与复制类错误
报错 | 原因 | 解决方案 |
---|
not master and slaveOk=false | 在从节点执行写操作 | 写操作需发往主节点 |
Replication is not configured | 副本集未初始化 | 在主节点执行 rs.initiate() |
Replication lag detected | 从节点复制延迟 | 检查网络延迟、磁盘IO,或调整 oplog 大小 |
oplog is not large enough | oplog 空间不足导致落后 | 增加 oplogSizeMB 并重启 |
⚙️ 六、性能与资源类错误
报错 | 原因 | 解决方案 |
---|
Too many open connections | 连接数超过限制 | 调整 maxIncomingConnections 或连接池 |
Exceeded memory limit for operation | 查询或聚合消耗太大内存 | 增加内存或启用 allowDiskUse:true |
Cursor not found | 游标超时或被关闭 | 避免长时间不取数据或设置 noCursorTimeout |
operation exceeded time limit | 查询超时 | 使用 maxTimeMS() 限制或优化索引 |
💡 七、驱动层错误(Node.js/Python 常见)
报错 | 说明 | 解决方法 |
---|
MongoServerSelectionError | 驱动无法选择合适节点 | 检查副本集连接字符串和网络 |
Topology was destroyed | 连接被关闭 | 确认连接池未提前关闭 |
Cannot read property 'collection' of undefined | 驱动未正确初始化连接 | 确保 await client.connect() 成功执行 |
Invalid schema version | Mongoose Schema 不匹配 | 检查模型定义与数据库实际结构 |
🔍 八、日志定位建议
常用日志路径:
- Linux 默认日志路径:
/var/log/mongodb/mongod.log
- 或在配置文件
/etc/mongod.conf
中查找: systemLog: path: /var/log/mongodb/mongod.log destination: file
快速查看最新日志:
tail -n 50 /var/log/mongodb/mongod.log
🧾 九、总结速查表
分类 | 常见错误关键词 | 处理重点 |
---|
连接类 | ECONNREFUSED / Timeout | 检查服务状态、网络端口、防火墙 |
认证类 | Authentication failed | 用户名/密码/认证库 |
权限类 | not authorized | 角色权限 |
语法类 | Unrecognized stage / Invalid operator | 版本兼容、表达式拼写 |
存储类 | E11000 / No space / 16MB limit | 唯一冲突、磁盘、文档过大 |
副本集 | not master / replication lag | 主从节点状态 |
性能类 | exceeded memory / cursor not found | 索引优化、聚合磁盘使用 |
发表回复