如何在Ruby中使用Mongoid 7.4.0驱动创建MongoDB数据库视图?
如何在Mongoid 7.4.0中正确创建MongoDB视图?
问题背景
Mongoid版本:7.4.0
服务类中编写的代码如下:
def initialize(auth_context = nil) super() @db = Mongoid::Clients.default end def get_order_view pipeline = [{ :'$project' => { :_id => 1, :product_id => 1, :product_name => 1, :quantity => 1, :amount => 1, } }] @db[:orders].view( 'get_orders_by_ids_view', pipeline ) end
调用该方法时出现错误:
"unexpected error occured, exception: 'undefined method `view' for #<Mongo::Collection:0x11100 namespace=demo-contract-manager.contracts>'"
正确解决方案
报错原因是Mongo::Collection对象没有view方法,在Mongoid 7.x版本中,创建持久化数据库视图需要通过数据库实例的create_view方法实现,具体步骤如下:
1. 修正数据库实例获取方式
Mongoid::Clients.default返回的是客户端对象,需要进一步获取对应的数据库实例:
def initialize(auth_context = nil) super() client = Mongoid::Clients.default @db = client.database # 获取当前客户端关联的数据库 end
2. 使用create_view创建持久化视图
调用数据库实例的create_view方法,传入视图名称、源集合名称和聚合管道:
def get_order_view pipeline = [{ :'$project' => { :_id => 1, :product_id => 1, :product_name => 1, :quantity => 1, :amount => 1, } }] # 创建持久化视图:参数顺序为 视图名、源集合名、聚合管道 @db.create_view('get_orders_by_ids_view', 'orders', pipeline) # 创建完成后,可以直接获取视图对应的集合对象返回 return @db[:get_orders_by_ids_view] end
额外说明
- 重复调用
create_view会因视图已存在报错,可先检查视图是否存在再执行创建,或使用create_view的可选参数处理重复场景。 - 若无需持久化视图,仅需临时查询,直接对集合执行聚合查询即可:
def get_order_view pipeline = [{ :'$project' => { :_id => 1, :product_id => 1, :product_name => 1, :quantity => 1, :amount => 1, } }] # 直接执行聚合查询,返回查询结果 return @db[:orders].aggregate(pipeline) end
内容的提问来源于stack exchange,提问作者Fahad Subzwari
相关产品推荐
相关产品推荐

