如何在Mongoid中以secondary读取模式执行聚合操作?
如何让Mongoid聚合操作以secondary读取模式执行?
你说得没错,确实可以通过添加{ read: :secondary }选项来实现,不过聚合操作的传参方式和普通查询有点不一样,这里给你两种可行的方案:
方案1:直接给aggregate方法传读取偏好参数
Mongo Ruby Driver(Mongoid底层依赖的驱动)的aggregate方法支持将读取偏好作为第二个参数传入,你只需要把选项加到原代码后面就行:
class User include Mongoid::Document field :name, type: String field :status, type: String field :balance, type: Float end User.collection.aggregate( [{ '$group' => { '_id' => '$status', 'total' => { '$sum' => '$balance' } } }], { read: :secondary } )
注意:我把$group里的status改成了_id,这是MongoDB聚合$group阶段的硬性要求——必须用_id字段来指定分组键,不然聚合会直接报错哦
方案2:用Mongoid的with块包裹操作
如果你觉得直接传参数不够直观,也可以用Mongoid提供的with方法临时设置读取偏好,块内的所有操作都会自动使用这个配置:
User.with(read: :secondary).collection.aggregate( [{ '$group' => { '_id' => '$status', 'total' => { '$sum' => '$balance' } } }] )
这种方式的好处是,如果后续还有其他需要走secondary的查询或聚合操作,都可以放在同一个with块里,不用重复传递参数。
简单查询能直接加{ read: :secondary }是因为Mongoid的查询方法(比如where、find)原生支持这个选项,但聚合是直接调用了底层驱动的方法,所以需要用上面两种方式来传递读取偏好。
内容的提问来源于stack exchange,提问作者Vitalii Paprotskyi
相关产品推荐
相关产品推荐

