是否可以在Mongoose的query级别设置read preference(读偏好)
问题结论
完全可以在单条查询的级别指定readPreference参数,不需要仅在全局连接时配置,适配你这种部分关键查询需要走主节点避免脏读、其他非敏感查询可以走从节点分摊压力的场景。
具体实现方式
Mongoose提供了两种常用的查询级别指定读偏好的写法:
方式1:链式调用read()方法
直接在查询语句后追加read()方法指定读偏好:
mongoose.connect('mongodb://localhost/myapp'); var MyModel = mongoose.model('Test', new Schema({ name: String })); // 示例:强制当前查询走主节点,避免复制延迟脏读 MyModel.findOne({'name':'dinesh'}) .read('primary') .exec(function (err, doc) { // 业务逻辑处理 });
read()方法支持传入的参数和MongoDB原生读偏好完全一致:
primary:强制只读主节点,适合你的写完立即读的关键场景,完全规避脏读primaryPreferred:优先读主节点,主节点不可用时读从节点secondary:强制只读从节点secondaryPreferred:优先读从节点,从节点不可用时读主节点nearest:选择网络延迟最低的节点读取
方式2:通过查询options参数传入
你也可以直接在findOne的options参数中指定读偏好:
MyModel.findOne( {'name':'dinesh'}, // 查询条件 null, // 投影参数,不需要指定返回字段时传null即可 { readPreference: 'primary' } // 配置项中指定读偏好 ).exec()
补充说明
全局连接时配置的读偏好会作为默认值生效,你仅需要在要求强一致性、写完立即读的关键查询上单独指定primary即可,其余非实时要求的查询仍然可以走从节点分摊主库压力。
内容的提问来源于stack exchange,提问作者Dinesh Gowda
相关产品推荐
相关产品推荐

