我正在使用mongoid进行mongodb聚合,使用ModleName.collection.aggregate(pipeline)
。返回的值是一个数组而不是Mongoid::Criteria
,所以如果在数组上执行first
,我会得到第一个类型为BSON::Document
而不是ModelName
的元素}。因此,我无法将其用作模型。
是否有方法从聚合中返回条件而不是数组,或者将bson文档转换为模型实例?
使用mongoid(4.0.0)
答案 0 :(得分:1)
我也一直在努力解决这个问题。我担心你必须建立自己的模型"靠自己。让我们从我的代码中拿一个例子:
class Searcher
# ...
def results(page: 1, per_page: 50)
pipeline = []
pipeline <<
"$match" => {
title: /#{@params['query']}/i
}
}
geoNear = {
"near" => coordinates,
"distanceField" => "distance",
"distanceMultiplier" => 3959,
"num" => 500,
"spherical" => true,
}
pipeline << {
"$geoNear" => geoNear
}
count = aggregate(pipeline).count
pipeline << { "$skip" => ((page.to_i - 1) * per_page) }
pipeline << { "$limit" => per_page }
places_hash = aggregate(pipeline)
places = places_hash.map { |attrs| Offer.new(attrs) { |o| o.new_record = false } }
# ...
places
end
def aggregate(pipeline)
Offer.collection.aggregate(pipeline)
end
end
我从原始项目中省略了很多代码,只是为了呈现我一直在做的事情。
最重要的是这条线:
places_hash.map { |attrs| Offer.new(attrs) { |o| o.new_record = false } }
我同时创建Offers
数组,但另外,我手动将new_record
属性设置为false
,因此它们的行为与其他任何属性相同文档通过简单Offer.where(...)
获得。
它不漂亮,但它对我有用,我可以充分利用整个聚合框架!
希望有所帮助!