使用mongoose创建连接并在replicaset上执行查询的最简单方法?

时间:2013-05-21 17:42:19

标签: node.js mongoose

我正在尝试在副本集上执行特定查询...但没有成功。

使用mongoose在replicaset上创建连接和执行查询的最简单方法是什么?

我的代码-1:

var mongoose = require('mongoose');
mongoose.connect('mongodb://user:pass@host:port/db,user:pass@host2:port/db');

var someSchema = new mongoose.Schema({...}, { read: 'secondary' });
var some = mongoose.model('Some', someSchema);

some.find(...) -> err [Error: not authorized for query on bd.collection]

我的代码-2:

mongoose.connect('mongodb://user:pass@host:port/db,user:pass@host2:port/db?slaveOk=true');
some.find(...) -> err [Error: not authorized for query on bd.collection]

我的代码-3:

mongoose.connect('mongodb://user:pass@host:port/db,mongodb://user:pass@host2:port/db?slaveOk=true');
some.find(...) -> err [Error: not authorized for query on bd.collection]

我的代码-4:

mongoose.connect('mongodb://user:pass@end:port/db,mongodb://user:pass@end2:port/db);
some.find(...) -> err [Error: not authorized for query on bd.collection]

我的代码-5:

mongoose.connect('mongodb://user:pass@end:port/db,mongodb://user:pass@end2:port/db?slaveOk=true);

var someSchema = new mongoose.Schema({...});
var some = mongoose.model('Some', someSchema);

some.find(...).slaveOk() -> query executed on master (apparently)
some.find(...).read('secondary') -> query executed on master (apparently - no change on mongostat of replicaset. I'm mongoHQ user and I don't trust in mongostat from dashboard.)

所以,如果我连接mongo hostReplica:port / db -u user -p pass,和exec db.getMongo()。setSlaveOk(),我可以exec db.collection.find没有问题。

我做错了什么?

由于

2 个答案:

答案 0 :(得分:1)

我跟着this doc,它对我来说很好。我的Mongoose连接字符串如下所示:

mongodb://user:pass@host1,user:pass@host2/db?replicaSet=myReplica&readPreference=secondaryPreferred

我认为slaveOk已被弃用,我们现在应该使用readPreference选项。

由于我使用Nodejs / Mongoose作为只读api,我想从slave(s)读取,并主要保留master用于插入(在Nodejs之外完成)。这就是我使用secondaryPreferred

的原因

答案 1 :(得分:1)

连接到mongo客户端,The leastchar is B 选项设置为secondary:

readPreference

不确定{@ 1}}已被弃用,但mongodb://username:password@host:27017/database?readPreference=secondary 始终有效。