Ruby mongoid聚合返回对象

时间:2015-04-01 11:03:02

标签: ruby mongoid

我正在使用mongoid进行mongodb聚合,使用ModleName.collection.aggregate(pipeline)。返回的值是一个数组而不是Mongoid::Criteria,所以如果在数组上执行first,我会得到第一个类型为BSON::Document而不是ModelName的元素}。因此,我无法将其用作模型。

是否有方法从聚合中返回条件而不是数组,或者将bson文档转换为模型实例?

使用mongoid(4.0.0)

1 个答案:

答案 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(...)获得。

它不漂亮,但它对我有用,我可以充分利用整个聚合框架!

希望有所帮助!