1

レプリカ セットで特定のクエリを実行しようとしていますが、成功しません。

マングースを使用して接続を作成し、レプリカセットでクエリを実行する最も簡単な方法は何ですか?

私のコード-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.)

SO、mongo hostReplica:port/db -u user -p pass で接続し、db.getMongo().setSlaveOk() を実行すると、問題なく db.collection.find を実行できます。

私が間違っていることは何ですか?

ありがとう

4

2 に答える 2

1

私はこのドキュメントに従いましたが、うまくいきました。Mongoose の接続文字列は次のようになります。

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

slaveOkこれは非推奨であり、このオプションを使用する必要があると思いreadPreferenceます。

読み取り専用 API に Nodejs/Mongoose を使用しているため、スレーブから読み取り、主に (Nodejs の外部で行われる) 挿入のためにマスターを保持したいと考えています。それが私が使用する理由ですsecondaryPreferred

于 2013-07-31T14:00:16.107 に答える