猫鼬与 Atlas 上的 ReplicaSet
Mongoose with ReplicaSet on Atlas
我在 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
如何将其转换为在 mongoose 中使用?如何构建我的 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';
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: 选项,从 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 和选项变量?
添加用户名和密码到数据库连接
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
ON MONGODB 3.4.x
根据 'Replica Set Connections' 部分的文档 (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 的 MongoDB Atlas 上。6.x,连接字符串更改为使用 DNS 服务器,使 link 更短。
mongodb+srv://MY_USER:MY_PASSWORD@MY_SERVER.mongodb.net/MY_DATABASE
...如果您在您的应用程序中使用此连接字符串,这将成功连接,但只有具有更高权限访问权限的 atlas 用户(atlasAdmin、readWriteAnyDatabase...)才能读取和写入。
如果您与仅具有读写数据库权限的特定用户一起工作,您将需要保留 MongoDB 3.4 中使用的相同连接字符串,因为猫鼬无法识别 DNS 选项(mongodb+srv).
P.S。来自 MongoDB 3.6.x 的所有新资源将继续正常工作!
我在 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
如何将其转换为在 mongoose 中使用?如何构建我的 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';
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: 选项,从 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 和选项变量?
添加用户名和密码到数据库连接
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
ON MONGODB 3.4.x
根据 'Replica Set Connections' 部分的文档 (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 的 MongoDB Atlas 上。6.x,连接字符串更改为使用 DNS 服务器,使 link 更短。
mongodb+srv://MY_USER:MY_PASSWORD@MY_SERVER.mongodb.net/MY_DATABASE
...如果您在您的应用程序中使用此连接字符串,这将成功连接,但只有具有更高权限访问权限的 atlas 用户(atlasAdmin、readWriteAnyDatabase...)才能读取和写入。
如果您与仅具有读写数据库权限的特定用户一起工作,您将需要保留 MongoDB 3.4 中使用的相同连接字符串,因为猫鼬无法识别 DNS 选项(mongodb+srv).
P.S。来自 MongoDB 3.6.x 的所有新资源将继续正常工作!