Featured image of post MongoDB 实战:Windows 安装、用户与权限配置

MongoDB 实战:Windows 安装、用户与权限配置

本文整理 MongoDB 6.0 在 Windows 上的安装、用户管理、库权限分配(dbOwner)、auth 启用后 Navicat 连不上的排错,以及如何给特定库建独立账号的最小可用 SOP。

为什么写这篇:MongoDB 的用户体系跟 MySQL 完全不同——user@host 不存在,取而代之的是 用户对库的 role(dbOwner、readWrite、read)。本文整理 MongoDB 6.0 在 Windows 上的安装 + 启用 auth + 给特定库建账号的完整流程。

适用读者:第一次部署 MongoDB、需要做用户管理的运维 / 后端。

前置知识:会用 mongosh 客户端、了解文档型数据库概念。

目录

  1. MongoDB 6.0 Windows 安装
  2. auth 启用前:建 root 账号
  3. 给特定库建独立账号
  4. 启用 auth 验证模式
  5. Navicat 连接报错的排错
  6. 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 安装

安装向导里两个关键点

  1. 数据目录:建议改成非系统盘(如 <MONGO_INSTALL_DIR>\data
  2. 日志目录:建议单独放(如 <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 库

1
2
mongosh
# 或老版本:mongo
1
use 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
mongosh
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 连不上,先看三件事:

  1. 防火墙:27017 端口是否开放
  2. bindIp:默认 127.0.0.1——只允许本机连,远程需要改 0.0.0.0
  3. 服务启动: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
dbOwnerdbAdmin + 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 用户体系对比

维度MySQLMongoDB
账号格式user@hostuser + authSource
权限粒度全局 / 库 / 表 / 列库 / collection
跨库权限一次 GRANT 给多个库role 数组里列多个库
角色继承自定义内置 role + 自定义 role
改密码ALTER USERdb.changeUserPassword
忘记 rootskip-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.0Couchbase / Amazon DocumentDB
时序数据MongoDB 8.0 TS CollectionsInfluxDB 3.x / TimescaleDB
向量检索MongoDB VSpgvector / Milvus / Qdrant
端边端轻量不用SQLite + sqlite-vec
图数据不擅长Neo4j / Memgraph

实战建议(2024+)

  1. 云上选 Atlas / DocumentDB——自建运维成本高,云原生是企业首选
  2. 关键业务加 Vector Search——RAG / 推荐系统用 MongoDB 一站式搞定
  3. schema validation 必开——MongoDB 灵活但要"灵活得有纪律"
  4. 审计 + 加密 2024+ 是合规硬要求
使用 Hugo 构建
主题 StackJimmy 设计