2

我在 MongoDB Atlas 中创建了一个集群,但似乎无法向其中写入数据。

const uri = "mongodb+srv://myUser:myPass@myDB-4myav.mongodb.net/portfolio";

我有这个作为我要连接的uri,每次我尝试写入数据库时​​,我都会收到这个错误:

{ MongoError:管理员未授权执行命令 { 插入:“用户”,文档:[[{name Daniel} {_id ObjectIdHex("5aa6d7d6396deb25844ccb52")} {__v 0}]],排序:false }

我已经读到我需要创建一个具有“root”角色的管理员用户,但是当我使用 mongo shell 连接到我的数据库并尝试创建它时,我得到了这个:

错误:无法添加用户:管理员未授权执行命令

所以基本上我没有可以写入我的数据库的用户。

我还尝试在 MongoDB Atlas 网站(当然对于我的集群)上创建一个具有每个角色的用户,然后通过 mongo shell 与它连接,但这也失败了。

总结一下:我在 MongoDB Atlas 上创建了一个新集群。我如何向它写入数据?

在此先感谢,如果我遗漏了一些简单而愚蠢的东西,请随时指出。

4

2 回答 2

5

{ MongoError:管理员未授权执行命令 { 插入:“用户”,文档:[[{name Daniel} {_id ObjectIdHex("5aa6d7d6396deb25844ccb52")} {__v 0}]],排序:false }

此错误表明您的代码正在尝试将文档插入admin数据库,该数据库是为用户和角色信息保留的系统数据库。

在您的连接字符串中,您打算使用portfolio数据库。但是,srv连接字符串格式不支持指定数据库,因此您的选项被忽略并使用了默认数据库admin。连接后需要选择portfolio数据库。

Mongoose 问题跟踪器( GitHub 问题 #6106 )中也报告了这一点,其中用户发布了您可以调整的解决方法:

mongoose.connection.on('connected', function() {
    // Hack the database back to the right one, because when using mongodb+srv as protocol.
    if (mongoose.connection.client.s.url.startsWith('mongodb+srv')) {
        mongoose.connection.db = mongoose.connection.client.db('portfolio');
    }
    console.log('Connection to MongoDB established.')
});
mongoose.connect(...);

我已经读到我需要创建一个具有“root”角色的管理员用户,但是当我使用 mongo shell 连接到我的数据库并尝试创建它时,我得到了这个:

您需要通过 MongoDB Atlas而不是mongoshell 来管理用户。您可以创建一个具有“读取和写入任何数据库”角色的用户帐户(或使用高级选项更精细的权限)。

于 2018-03-13T09:55:36.560 回答
3

您需要从 Mongo Shell创建一个具有root角色的用户,

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

或者您需要通过图集添加新用户(请参阅下面的快照)

  1. 转到集群
  2. 点击安全
  3. 点击添加新用户
  4. 输入用户名
  5. 基于 SCRAM-SHA1 方法创建密码
  6. 选择角色Atlas 管理员
  7. 点击添加用户

添加新用户

创建用户后,转到Clusters --> OverView --> CONNECT

  1. 验证 IP 白名单
  2. 选择连接方式:
    • 与 Mongo Shell 连接(我正在选择)
    • 连接您的应用程序
    • 连接 MongoDB Compass

$ mongo "mongodb+srv://project-u-s3cgp.azure.mongodb.net/test" --username dbAdmin

MongoDB shell version v3.6.1

Enter password:

connecting to: mongodb+srv://project-u-s3cgp.azure.mongodb.net/test

.........
.........

MongoDB Enterprise project-U-shard-0:PRIMARY>db.user.insert({name:"Daniel"})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise O2Ci-U-shard-0:PRIMARY>

我希望,您可以在创建root用户后插入记录。

谢谢,卡西克

于 2018-03-13T10:31:14.560 回答