如何使用mongosh新建一个集合

mongosh 怎么使用,我需要新建一个集合

mongosh 是 MongoDB 的官方交互式 shell,用于在命令行与 MongoDB 实例进行交互。以下是使用 mongosh 新建一个集合的基本步骤:

  1. 启动 mongosh: 首先,确保 MongoDB 服务已经在您的系统上启动。然后,在终端或命令提示符中输入 mongosh 并按回车键启动 MongoDB Shell。

  2. 连接到数据库: 如果你已经运行了 mongosh 并且 MongoDB 服务是本地运行并使用默认端口,那么你通常会自动连接到本地 MongoDB 实例。如果需要连接到远程数据库或特定的本地数据库实例,可以使用以下格式的命令:

    mongosh "mongodb://username:password@hostname:port/database"
    

    替换 usernamepasswordhostnameportdatabase 为实际的用户名、密码、主机名、端口号和数据库名称。

  3. 选择数据库: 使用 use 命令来选择要操作的数据库,如果数据库不存在,MongoDB 将会在添加第一条数据时创建它。

    use yourDatabaseName
    
  4. 创建集合: 创建新集合有几种方法。其中一种是直接向集合插入数据,集合会被自动创建。还有一种方法是使用 db.createCollection 命令显式创建空集合,这允许你指定额外的选项,比如集合的验证规则等。

    • 自动创建集合: 只需插入数据到集合,如果集合不存在,MongoDB 会自动创建它。
      db.yourCollectionName.insert({ key: 'value' })
      
    • 显式创建集合: 使用 createCollection 方法,可以指定集合名称,并可选地传递一些参数。
      db.createCollection("yourCollectionName", options)
      
      其中 options 是一个包含不同属性的对象,例如 capped, autoIndexId, size 等,来自定义集合的行为。
  5. 验证集合是否已创建: 您可以使用 show collections 命令来列出当前数据库中的所有集合,以验证您的集合是否已成功创建。

以上就是使用 mongosh 新建一个集合的基本步骤。在开始之前,请确保您有 MongoDB 数据库的访问权限,并且知道如何与您的数据库实例建立连接。

mongosh 怎么新建一个用户并把某个集合授权给该用户读写权限

在 MongoDB 中新建用户并为其授权访问特定集合的读写权限,您需要使用 db.createUser 方法来创建用户,并在创建时指定相应的权限。请按照以下步骤操作:

  1. 启动 mongosh: 打开命令行工具并输入 mongosh 来启动 MongoDB Shell。

  2. 连接到 admin 数据库: 通常情况下,用户和角色的管理是在 admin 数据库中进行的。所以,首先要切换到 admin 数据库:

    use admin
    
  3. 创建用户: 使用 db.createUser 命令来创建一个新用户并分配适当的权限。这个命令允许您为用户设置用户名、密码以及相关的角色。例如,如果您想创建一个用户,让该用户拥有对 yourDatabaseName 数据库中名为 yourCollectionName 集合的读写权限,可以使用如下命令:

    db.createUser({
        user: "yourUsername",
        pwd: "yourPassword",
        roles: [
            { role: "readWrite", db: "yourDatabaseName", collection: "yourCollectionName" }
        ]
    })
    

    在这里,yourUsernameyourPassword 是您希望创建的新用户的用户名和密码,而 yourDatabaseNameyourCollectionName 分别是数据库名称和集合名称。

注意事项:

  • 确保您具有足够的权限来创建用户。
  • 出于安全考虑,不要在命令或脚本中明文保存密码。
  • 如果您不想限制用户对单一集合的读写权限,可以将角色设为 "readWrite" 而不指定集合,从而授予对整个数据库的读写权限。
  • 请检查您的 MongoDB 版本是否支持基于集合级别的权限,因为在某些版本中可能不支持。
  • 对于生产环境,您应该遵循最小权限原则,仅授予必要的权限。
  • 创建用户之后,您可能需要重新启动 MongoDB 或者重新认证以使改变生效。

执行以上步骤后,您应该成功地为特定数据库中的特定集合创建了一个具有读写权限的用户。

怎么查看已经设置好了权限

在MongoDB中,您可以通过查看用户的角色和权限来确认用户的权限设置。使用mongosh,您可以执行以下步骤来查看用户的权限:

  1. 启动 mongosh: 打开命令行工具,并输入 mongosh 启动 MongoDB Shell。

  2. 连接到 admin 数据库: 权限和用户通常是在 admin 数据库中管理的。使用下面的命令切换到 admin 数据库:

    use admin
    
  3. 查看特定用户信息: 使用 db.getUser 或者 db.getUsers 方法可以查看用户的详细信息,包括他们的角色和权限。为了查找特定用户的信息,请运行:

    db.getUser("yourUsername")
    

    替换 "yourUsername" 为实际的用户名。

  4. 查看所有用户及其角色: 如果您想列出所有用户及其角色,可以使用:

    db.getUsers()
    

这些命令将返回一个文档,其中包含用户的详细信息,如用户名、用户所属的数据库和用户被授予的角色列表。每个角色都会关联到特定的数据库,甚至有时候到特定的集合,角色决定了用户的权限。

例如,如果某个用户有对数据库 yourDatabaseName 中的 yourCollectionName 集合的读写权限,该用户的角色列表可能会包含类似以下的条目:

{
  "roles": [
    {
      "role": "readWrite",
      "db": "yourDatabaseName",
      "collection": "yourCollectionName"
    }
    // 其他角色...
  ]
}

请注意,在不同版本的 MongoDB 中,对于角色和权限的管理可能略有不同。始终参照您所使用的 MongoDB 版本的官方文档以获得最准确的信息。

如果您需要更深入地理解用户的实际权限(尤其是如果使用了自定义角色),您可能需要查看角色的定义。可以使用 db.getRoledb.getRoles 命令查看角色的详细权限定义。例如,要获取特定角色的详细定义,可以使用:

db.getRole("roleName", { showPrivileges: true })

这会显示角色具有的所有权限。

但是在nodejs就是报错

 MongoServerError: Authentication failed.
  at Connection.onMessage (node_modules/.pnpm/[email protected]/node_modules/mongodb/src/cmap/connection.ts:449:20)
  at MessageStream.<anonymous> (node_modules/.pnpm/[email protected]/node_modules/mongodb/src/cmap/connection.ts:241:56)
  at MessageStream.emit (node:events:514:28)
  at MessageStream.emit (node:domain:488:12)
  at processIncomingData (node_modules/.pnpm/[email protected]/node_modules/mongodb/src/cmap/message_stream.ts:188:12)
  at MessageStream._write (node_modules/.pnpm/[email protected]/node_modules/mongodb/src/cmap/message_stream.ts:69:5)
  at writeOrBuffer (node:internal/streams/writable:556:12)
  at _write (node:internal/streams/writable:490:10)
  at MessageStream.Writable.write (node:internal/streams/writable:494:10)
  at Socket.ondata (node:internal/streams/readable:985:22)
  at Socket.emit (node:events:514:28)
  at Socket.emit (node:domain:488:12)
  at addChunk (node:internal/streams/readable:545:12)
  at readableAddChunkPushByteMode (node:internal/streams/readable:495:3)
  at Socket.Readable.push (node:internal/streams/readable:375:5)
  at TCP.onStreamRead (node:internal/stream_base_commons:190:23)

出现“Authentication failed”错误通常意味着在尝试连接到 MongoDB 时身份验证失败了。这可能是由于多种原因造成的,比如用户名、密码输入错误,或者是连接字符串不正确。

请确保您在 Node.js 应用程序中使用的 MongoDB 连接 URI 包含正确的用户名和密码。连接字符串的格式通常如下:

mongodb://username:password@host:port/database

你需要将 usernamepassword 替换为实际的数据库用户名和密码。请注意,如果密码中包含特殊字符(如@, :, /, ?, &, =),它们必须进行URL编码。

此外,Node.js 连接字符串可能还需要指定其他参数,例如认证数据库(authSource)。对于您创建的 opentaskai 用户,默认的认证数据库应该是 admin,因此连接字符串可能看起来像这样:

mongodb://testuser:yourPassword@localhost:27017/testdb?authSource=admin

请确认以下几点:

  1. 用户名和密码是否正确:确保没有拼写错误,并且与在 MongoDB 中设置的完全一致。

  2. 认证数据库是否正确:在上述连接字符串中 authSource=admin 表明了用户认证应该通过 admin 数据库进行。如果您的用户是在另一个数据库下创建的,请相应地更改 authSource 参数。

  3. 端口号是否正确:默认情况下 MongoDB 运行在端口 27017,除非您更改了设置,请确认端口号正确。

  4. 网络连接:确认您的 Node.js 应用程序能够访问 MongoDB 所在的主机和端口。

  5. MongoDB 驱动版本:某些驱动版本可能存在兼容性问题。确保您使用的 MongoDB Node.js 驱动与 MongoDB 数据库版本兼容。

  6. 安全/防火墙设置:如果有的话,确保它们不会阻止您的应用程序与 MongoDB 数据库之间的连接。

  7. MongoDB 服务状态:再次确认 MongoDB 服务正在运行,并且可以接收连接。

如果您已经检查了以上所有可能的问题,但仍然无法解决问题,请尝试在 Node.js 应用程序中直接打印出连接字符串,并手动测试它是否工作正常,例如可以在命令行中使用 mongosh 进行测试。如果在 mongosh 中连接成功,而在 Node.js 应用程序中失败,则可能需要进一步调查代码逻辑或配置问题。

如果我不想加authSource=admin 呢,程序是通用的

如果您的 Node.js 应用程序设计为不显式指定 authSource,并且目标是能够适应多种环境和配置,那么一种方法是在创建用户时将其直接放置在目标数据库中。

然而,通常不推荐这样做,因为 MongoDB 的通用做法是将所有用户存储在 admin 数据库中。不过,如果您确实需要用户直接在目标数据库中(例如 testuser),您可以尝试以下操作:

  1. 删除当前用户:首先删除现有的 testuser 用户。
use admin;
db.dropUser("testuser");
  1. 在目标数据库中重新创建用户:切换到您的目标数据库 testdb 并创建用户。
use testdb;
db.createUser({
  user: "testuser",
  pwd: "yourPassword", // 将 yourPassword 替换为该用户的密码
  roles: [{ role: "readWrite", db: "testdb" }]
});
  1. 验证新用户:使用新的认证信息连接到数据库,确保不要添加 authSource=admin
const uri = "mongodb://opentaskai:yourPassword@localhost:27017/testdb";

请注意,这种方法可能会与某些安全最佳实践相冲突,并且可能导致在未来进行数据库维护或迁移时产生复杂性。大多数生产级的 MongoDB 环境都会选择在 admin 数据库中维护用户,因为这允许集中管理身份验证和授权。

如果您希望您的应用程序适应各种环境,另一种方法是在应用程序逻辑中检测是否需要添加 authSource 参数。例如,您可以在配置文件、环境变量或启动参数中设置一个标志,以决定是否需要附加这个参数。

最后,请务必在每次对用户或权限进行修改之后都重新测试 Node.js 应用程序的连接,以确认更改是否生效且无其他影响。