使用Mongoose和SRV连接字符串将数据插入MongoDB Atlas

时间:2018-03-12 20:04:36

标签: mongodb mongoose mongodb-atlas

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

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

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

{ MongoError: not authorized on admin to execute command { insert: "users", documents: [[{name Daniel} {_id ObjectIdHex("5aa6d7d6396deb25844ccb52")} {__v 0}]], ordered: false }

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

Error: couldn't add user: not authorized on admin to execute command

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

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

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

提前致谢,请随时指出我是否遗漏了一些简单而愚蠢的事情。

2 个答案:

答案 0 :(得分:5)

  

{MongoError:管理员未授权执行命令{insert:“users”,documents:[[{name Daniel} {_id ObjectIdHex(“5aa6d7d6396deb25844ccb52”)} {__v 0}]],ordered:false}

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

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

在Mongoose问题跟踪器(GitHub issue #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连接到我的数据库并尝试创建它时,我得到了这个:

您需要manage users via MongoDB Atlas而不是mongo shell。您可以使用“读取和写入任何数据库”角色创建用户帐户(或使用“高级选项”更精细的权限)。

答案 1 :(得分:2)

您需要使用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. 选择ROLE Atlas admin
  7. 点击添加用户
  8. AddNew-USER

    创建用户后,转到群集 - > OverView - > 连接

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

      $ 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 用户后插入记录。

      谢谢, Karthick