我正在尝试在副本集上执行特定查询...但没有成功。
使用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没有问题。
我做错了什么?
由于
答案 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
始终有效。