MongoDB简单用法

发布于:2025-04-16 ⋅ 阅读:(24) ⋅ 点赞:(0)

在这里插入图片描述
图片中 MongoDB Compass 中显示了默认的三个数据库:

  • admin
  • config
  • local

如果在 .env 文件中配置的是:

MONGODB_URI=mongodb://admin:password@localhost:27017/
MONGODB_NAME=RAGSAAS

💡 一、为什么 Compass 里没有 RAGSAAS 数据库?

MongoDB 是懒创建(lazy creation)机制:

MongoDB 只有在你向某个数据库真正写入数据之后,才会创建这个数据库并显示在 Compass 或 CLI 中。

✅ 解决方法:

只需要写入一条数据到你配置的数据库,比如 RAGSAAS,MongoDB 就会自动创建这个库,并在 Compass 中显示出来。


🧪 示例:用 Python 写一条测试数据到 RAGSAAS

你可以运行以下代码测试连接和写入:

from pymongo import MongoClient

# 和你的 .env 配置保持一致
uri = "mongodb://admin:password@localhost:27017/"
client = MongoClient(uri)

# 使用指定的数据库(如果没有,会在插入时自动创建)
db = client["RAGSAAS"]
collection = db["test_collection"]

# 插入一条数据
collection.insert_one({"message": "Hello MongoDB from RAGSAAS!"})

print("插入成功!")

然后重新打开或刷新 Compass,就能看到 RAGSAAS 数据库了。


🛠️ 二、连接字符串存在的问题

MONGODB_URI=mongodb://admin:password@localhost:27017/

这个 URI 表示启用了 MongoDB 用户认证(admin:password),但目前 Compass 没看到任何认证提示,说明你可能还没有真的创建这个用户。

🔍 检查:

你可以打开终端或用 mongosh 执行以下命令看看当前是否存在用户:

use admin
db.getUsers()

如果没有用户,可以这样创建:

use admin
db.createUser({
  user: "admin",
  pwd: "password",
  roles: [{ role: "root", db: "admin" }]
})

然后你就可以使用 URI:

mongodb://admin:password@localhost:27017/

✅ 总结

状态或建议
Compass 看不到 RAGSAAS 因为你还没插入数据
.env 配置了 RAGSAAS 数据库 没问题,写入一次数据就会创建
使用了账号密码连接 确保你在 MongoDB 中已经用 db.createUser 创建过该用户
MongoDB 数据库是否存在 MongoDB 是“写了才算存在”,没写之前不会显示

为什么要加 roles: [{ role: “root”, db: “admin” }]


✅ 一、roles 是什么?为什么要加?

MongoDB 是一个支持 角色权限控制(Role-Based Access Control, RBAC) 的数据库。

当使用 db.createUser() 创建用户时,如果不指定 roles,MongoDB 根本不会知道这个用户可以“干什么”。


🚫 如果你不加 roles 会发生什么?

创建的用户默认会是“没有任何权限的空壳用户”。

比如运行:

db.createUser({
  user: "admin",
  pwd: "password"
})

虽然这个用户会被成功创建,但它没有权限做任何事情:

  • 不能读写数据;
  • 不能创建数据库;
  • 甚至连登录后 show dbs 都可能被拒绝。

这就像你办了一张身份证,但没有分配任何门禁卡,你哪都进不去。


✅ 加上 roles: [{ role: "root", db: "admin" }] 的作用

这是给用户分配了一个权限最大的角色:root 超级管理员

这个角色可以干所有事情,包括:

  • 增删改查任意数据库;
  • 创建新用户;
  • 设置权限;
  • 查看系统状态;
  • 甚至删除整个实例的所有数据库。

你可以理解为这是 MongoDB 的“超级管理员”或“DBA”。


👇常见角色对比(简单表格)

角色名 作用 建议用途
read 只能读指定库 只读访问
readWrite 读写指定库 普通应用使用
dbAdmin 管理数据库结构(如创建索引) 数据库管理员
userAdmin 管理用户 管理权限
root 拥有所有权限(跨库) 超级管理员,建议只用于开发和初始搭建

✍️ 举个例子:不同角色的差异

假设你要写一条数据到 RAGSAAS 数据库:

  • 如果你用户只有 read 权限,会被拒绝写入。
  • 如果你是 readWrite,可以正常读写。
  • 如果你是 root,不仅能写,还能给其他人分配权限。

✅ 最佳实践建议

  • 开发环境:你可以直接用 root,方便测试和开发。
  • 生产环境:不要使用 root,应当:
    • 创建一个 readWrite 用户供应用访问;
    • 创建一个 userAdmin 用户供权限管理;
    • 仅在特殊情况下使用 root

🔚 总结一句话:

roles 是 MongoDB 授权控制的核心,你不给角色,用户就像没有“钥匙”的人,什么也干不了。给了 root,就等于给了万能钥匙 🔑。