为什么写这篇:MongoDB 的用户体系跟 MySQL 完全不同——user@host 不存在,取而代之的是 用户对库的 role(dbOwner、readWrite、read)。本文整理 MongoDB 6.0 在 Windows 上的安装 + 启用 auth + 给特定库建账号的完整流程。
适用读者:第一次部署 MongoDB、需要做用户管理的运维 / 后端。
前置知识:会用 mongosh 客户端、了解文档型数据库概念。
目录
- MongoDB 6.0 Windows 安装
- auth 启用前:建 root 账号
- 给特定库建独立账号
- 启用 auth 验证模式
- Navicat 连接报错的排错
- MongoDB 用户体系速查
1. MongoDB 6.0 Windows 安装
1.1 下载
- 官方地址:
https://www.mongodb.com/try/download/community - 直链示例:
https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-6.0.5-signed.msi
1.2 安装
安装向导里两个关键点:
- 数据目录:建议改成非系统盘(如
<MONGO_INSTALL_DIR>\data) - 日志目录:建议单独放(如
<MONGO_INSTALL_DIR>\log)
默认安装路径:C:\Program Files\MongoDB\Server\6.0\bin
1.3 验证
1
2
3
| # PowerShell
& "C:\Program Files\MongoDB\Server\6.0\bin\mongod.exe" --version
# db version v6.0.5
|
2. auth 启用前:建 root 账号
关键约束:MongoDB 启用 auth 之前必须先建超级管理员账号,否则启用后无人能登录——这跟 MySQL 8.0 改密码插件时的注意事项类似。
2.1 进入 admin 库
2.2 创建超级管理员
1
2
3
4
5
| db.createUser({
user: "admin",
pwd: "{{REDACTED}}",
roles: ["root"]
})
|
root role 是 MongoDB 内置的最高权限角色,可以做任何操作。
2.3 验证(仍在 admin 库)
1
2
| db.auth("admin", "{{REDACTED}}")
// 返回 1 = 成功
|
3. 给特定库建独立账号
生产最佳实践:每个应用库都有独立的 dbOwner 账号——这样即使某个库账号泄露,攻击者也只能动一个库。
3.1 进入目标库
1
2
3
| use kuaibao
// 注意 use kuaibao 不需要 kuaibao 库已存在
// 但创建账号前要先 use 进来
|
3.2 创建库级账号
1
2
3
4
5
6
7
| db.createUser({
user: "kb",
pwd: "{{REDACTED}}",
roles: [
{ role: "dbOwner", db: "kuaibao" }
]
})
|
dbOwner 包含的权限:
| 操作 | 能否做 |
|---|
| read / write 数据 | ✓ |
| create / drop collection | ✓ |
| create / drop index | ✓ |
| 建账号、改密码 | ✓(限本库) |
| 跨库读写 | ✗ |
4. 启用 auth 验证模式
4.1 编辑配置文件
1
2
3
4
| # C:\Program Files\MongoDB\Server\6.0\bin\mongod.cfg
security:
authorization: enabled
|
4.2 重启 MongoDB 服务
1
2
3
4
| # 服务方式
Restart-Service MongoDB
# 或任务管理器 → 服务 → MongoDB → 重启
|
4.3 验证 auth 已生效
1
2
3
| use kuaibao
show collections
// 应该报错:not authorized on kuaibao to execute command
|
1
2
3
4
| db.auth("kb", "{{REDACTED}}")
// 返回 1 = 验证成功
show collections
// 现在能正常显示了
|
重要:用 db.auth() 之前必须先 use <库名>——auth 是对当前库生效的。
5. Navicat 连接报错的排错
5.1 启用 auth 后 Navicat 连不上
现象:输入正确账号密码后报错 “auth failed” 或 “command listDatabases not allowed”。
原因:用 kb 账号登录但想 list 所有库——而 kb 只有 kuaibao 库的 dbOwner 权限。
修法:
- 方法 1:在 Navicat 里只勾选
kuaibao 库(连接属性 → Databases → 只勾需要的) - 方法 2:用
admin(root)账号登录——能看所有库
5.2 老版本 MongoDB 客户端连接
MongoDB 5.0+ 启用了 SCRAM-SHA-256 认证,老客户端(MongoDB 4.2 之前的)连不上。修法:
- 升级客户端到 4.2+
- 或临时改成
SCRAM-SHA-1(不推荐,安全性下降)
5.3 Navicat 的 authSource
Navicat 连接 MongoDB 时,authSource 默认是 admin——意思是"用 admin 库验证身份"。如果你的用户是建在 kuaibao 库里,必须改:
1
| 连接属性 → Advanced → Authentication source: kuaibao
|
否则用 kb/{{REDACTED}} 登录会被当成"在 admin 库找 kb 用户"——找不到。
5.4 连接超时
mongodb://10.0.0.10:27017 连不上,先看三件事:
- 防火墙:27017 端口是否开放
- bindIp:默认
127.0.0.1——只允许本机连,远程需要改 0.0.0.0 - 服务启动:Windows 服务
MongoDB Server 是否在 Running
1
2
3
4
| # mongod.cfg
net:
port: 27017
bindIp: 0.0.0.0 # 监听所有网卡
|
6. MongoDB 用户体系速查
6.1 内置角色
| 角色 | 权限范围 | 适用 |
|---|
root | 所有库 + 所有操作 | 超级管理员 |
dbAdmin | 库 schema、索引、统计 | DBA |
dbOwner | dbAdmin + readWrite + 建账号 | 应用库账号 |
readWrite | 读写数据 | 普通应用 |
read | 只读 | BI 报表 |
userAdmin | 只能建/改账号 | 权限管理员 |
clusterAdmin | 整个集群 | 集群 DBA |
6.2 角色继承
MongoDB 的 role 是叠加的——可以一次给多个 role:
1
2
3
4
5
6
7
8
9
| db.createUser({
user: "report",
pwd: "{{REDACTED}}",
roles: [
{ role: "read", db: "kuaibao" },
{ role: "read", db: "log_center" },
{ role: "readWrite", db: "report_tmp" }
]
})
|
6.3 跨库只读
1
2
3
4
5
6
7
8
9
10
11
12
| // 跨 5 个库都只读
db.createUser({
user: "bi_user",
pwd: "{{REDACTED}}",
roles: [
{ role: "read", db: "kuaibao" },
{ role: "read", db: "log_center" },
{ role: "read", db: "user_center" },
{ role: "read", db: "order_center" },
{ role: "read", db: "goods_center" }
]
})
|
6.4 修改用户密码
1
2
3
4
5
6
| // 改当前库用户
db.changeUserPassword("kb", "{{NEW_REDACTED}}")
// 改其他库用户(需要先 use 过去)
use admin
db.changeUserPassword("admin", "{{NEW_REDACTED}}")
|
6.5 删除用户
1
2
| use kuaibao
db.dropUser("kb")
|
6.6 查看所有用户
1
2
| use admin
db.system.users.find().pretty()
|
常见坑
坑 1:use 库与 createUser 的关系
1
2
3
4
| use some_db
db.createUser({...}) // 创建的是 some_db 里的用户
// 用户名是 some_db 里的,但 username 还是 'kb'
// 登录时需要 authSource=some_db
|
坑 2:root 账号登录后想看所有库
1
2
3
4
5
| // 必须用 admin 库验证
use admin
db.auth("admin", "{{REDACTED}}")
show dbs
// 这次能列出所有
|
坑 3:enable auth 后忘了 admin 密码
修法:临时关闭 auth → 重建账号 → 再开 auth。
1
2
3
| # mongod.cfg
security:
# authorization: enabled # 注释掉
|
1
| Restart-Service MongoDB
|
1
2
3
4
| mongosh
use admin
db.createUser({ user: "admin", pwd: "{{NEW_REDACTED}}", roles: ["root"] })
// 退出
|
1
2
| security:
authorization: enabled # 重新开启
|
1
| Restart-Service MongoDB
|
坑 4:MongoDB 6.0 默认不再绑定 localhost
6.0 起默认 bindIp: localhost——只能本机连。远程连接必须改 0.0.0.0。
MongoDB vs MySQL 用户体系对比
| 维度 | MySQL | MongoDB |
|---|
| 账号格式 | user@host | user + authSource |
| 权限粒度 | 全局 / 库 / 表 / 列 | 库 / collection |
| 跨库权限 | 一次 GRANT 给多个库 | role 数组里列多个库 |
| 角色继承 | 自定义 | 内置 role + 自定义 role |
| 改密码 | ALTER USER | db.changeUserPassword |
| 忘记 root | skip-grant-tables | 临时关 auth |
| 客户端默认 auth | 库是 mysql | 库是 admin |
下一步
- MySQL 实时同步 Canal / Debezium:见《MySQL 实时同步实战》
- PostgreSQL + TimescaleDB:见《PostgreSQL 实战》
- 国产数据库人大金仓:见《人大金仓实战》
2024+ 视角:MongoDB 7.0 / 8.0 与 AI 时代
MongoDB 7.0 关键变化
- 可恢复的删除:误删的 collection 可在"可恢复删除窗口"内
db.coll.restoreCollection() 救回 - 加密查询(Queryable Encryption):字段级加密 + 支持
$eq / $range 等范围查询——以前只能完全密文,2024+ 平衡了"安全 + 可查" - 分片集群自动负载均衡:Balancer 引入"区域感知",跨地域部署延迟降 20%
MongoDB 8.0(2024-08 GA)核心新特性
- 复合通配符索引(Compound Wildcard Indexes):一个索引覆盖整个文档结构——以前需要为每种字段组合建索引
- 时序集合(Time Series Collections)增强:内置降采样、压缩,替代 InfluxDB 不少场景
- MongoDB Vector Search GA:与 Atlas 集成,支持
$vectorSearch 聚合阶段——直接对标 pgvector
1
2
3
4
5
6
7
8
9
10
11
12
| // 8.0 向量检索示例
db.embeddings.aggregate([
{
$vectorSearch: {
index: "vector_index",
path: "embedding",
queryVector: [0.1, 0.2, ...],
numCandidates: 100,
limit: 5
}
}
])
|
角色体系的 2024+ 演进
MongoDB 7.0+ 引入 Built-in Roles for Time Series / Atlas Stream Processing——按需细粒度授权:
| 角色 | 适用 |
|---|
readAnyDatabase | 跨库只读 |
readWriteAnyDatabase | 跨库读写 |
dbAdmin 扩展 | 时序集合管理 |
backup / restore | 备份恢复专用 |
mongosh 替代 mongo 客户端
2022 年起 mongo 官方标记为 deprecated,生产环境必须用 mongosh:
1
2
3
4
5
6
7
8
| # 装 mongosh
brew install mongosh # macOS
# 或下载解压
wget https://downloads.mongodb.com/compass/mongosh-2.3.0-linux-x64.tgz
# 旧习惯 → 新习惯
mongo --host 10.0.0.10 # ❌ 已废弃
mongosh "mongodb://10.0.0.10:27017/admin" # ✅
|
安全 2024+ 新基线
- 强制 TLS:所有连接必须
tls=true,明文连接官方弃用 - SCRAM-SHA-256 默认:SCRAM-SHA-1 已废弃,2025 后将移除
- 审计日志结构化:
auditLog 写 JSON,可直接对接 ELK
替代品对比(2024+ 视角)
| 场景 | MongoDB | 替代品 |
|---|
| 通用文档库 | MongoDB 8.0 | Couchbase / Amazon DocumentDB |
| 时序数据 | MongoDB 8.0 TS Collections | InfluxDB 3.x / TimescaleDB |
| 向量检索 | MongoDB VS | pgvector / Milvus / Qdrant |
| 端边端轻量 | 不用 | SQLite + sqlite-vec |
| 图数据 | 不擅长 | Neo4j / Memgraph |
实战建议(2024+)
- 云上选 Atlas / DocumentDB——自建运维成本高,云原生是企业首选
- 关键业务加 Vector Search——RAG / 推荐系统用 MongoDB 一站式搞定
- schema validation 必开——MongoDB 灵活但要"灵活得有纪律"
- 审计 + 加密 2024+ 是合规硬要求