我在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选项,从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-01-clv3h.mongodb.net:27017,' +
'MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE';
var options = {
ssl: true,
authSource: 'MY_ADMIN_DATABASE',
replicaSet: 'MY_REPLICASET_NAME-shard-0'
};
var db = mongojs(uri,'', options);
但是,我需要使用mongoose,因为我的项目中有ODM。
如何使用mongoose构建我的uri和options变量?
答案 0 :(得分:11)
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)。
P.S。 MongoDB 3.6.x的所有新资源将继续正常运行!
答案 1 :(得分:0)
将用户名和密码添加到数据库连接
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]