我在MongoDB Atlas上有一个副本集,这是我的mongo
shell连接字符串完美连接:
$mongo "mongodb://MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,MY_SERVER-shard-00-01-clv3h.mongodb.net:27017,MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE?replicaSet=MY_REPLICASET-NAME-shard-0" --ssl --username MY_USERNAME --password MY_PASSWORD --authenticationDatabase MY_ADMIN_DATABASE
如何将其转换为在猫鼬中使用?我如何构建我的uri和options变量?
我尝试了以下但没有成功:
// connection string using mongoose: var uri = 'mongodb://MY_USER:MY_PASSWORD@' + 'MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,' + 'MY_SERVER-shard-00-01-clv3h.mongodb.net:27017,' + 'MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE'; var options = { replset: { ssl: true,authSource: 'MY_ADMIN_DATABASE',rs_name: 'MY_REPLICASET_NAME-shard-0' } }; mongoose.connect(uri,options); var db = mongoose.connection;
我尝试过包含user:和pass:on options,从uri中删除MY_USER:MY_PASSWORD @,将rs_name更改为replicaSet,每次尝试失败.似乎mongoose没有考虑authSource选项.
使用mongojs,它可以正常使用以下代码:
// connection string using mongojs: var uri = 'mongodb://MY_USER:MY_PASSWORD@' + 'MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,' + 'MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE'; var options = { ssl: true,replicaSet: 'MY_REPLICASET_NAME-shard-0' }; var db = mongojs(uri,'',options);
但是,我需要使用mongoose,因为我的项目中有ODM.
如何使用mongoose构建我的uri和options变量?
解决方法
ON MONGODB 3.4.x
根据“副本集连接”部分的文档(http://mongoosejs.com/docs/connections.html),我解决了这个问题,将’options’值直接放在’uri’字符串中.
// connection string using mongoose: var uri = 'mongodb://MY_USER:MY_PASSWORD@' + 'MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,' + 'MY_SERVER-shard-00-01-clv3h.mongodb.net:27017,' + 'MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE' + 'ssl=true&replicaSet=MY_REPLICASET_NAME-shard-0&authSource=MY_ADMIN_DATABASE'; mongoose.connect(uri); var db = mongoose.connection;
现在,它工作正常!
有关MONGODB的通知3.6
在使用版本3.6.x的MongoDB Atlas上,连接字符串已更改为使用DNS服务器使链接更短.
mongodb+srv://MY_USER:MY_PASSWORD@MY_SERVER.mongodb.net/MY_DATABASE
…如果您在应用程序中使用此连接字符串,这将成功连接,但它只能与具有更高权限访问权限的atlas用户进行读写(atlasAdmin,readWriteAnyDatabase …).
要使用具有仅读取数据库权限的特定用户,您需要保留MongoDB 3.4中使用的相同连接字符串,因为mongoose无法识别DNS选项(mongodb srv).
附: MongoDB 3.6.x的所有新资源将继续正常运行!