Mongoid $项目聚合不返回任何内容

时间:2015-11-18 09:02:49

标签: ruby mongodb mongoid aggregation-framework

我正在尝试使用Mongoid执行以下聚合:

 Award.collection.aggregate( [ {"$project" => {:"value.amount"=> 1}} ] )

返回:

#<Mongo::Collection::View::Aggregation:0x0055cc6e8658b8
@options={},
@pipeline=[{"$project"=>{:"value.amount"=>1}}],
@view=#<Mongo::Collection::View:0x47168257993960   
namespace='elvis_development.awards @selector={} @options={}>>

所以没有结果但也没有错误。这个版本的语法与它们在the docs中提供的示例相同,但我也尝试了不同的语法,但没有成功。在mongo shell中:

db.awards.aggregate( [ { $project : { value.amount : 1 } } ] )

返回所需的结果。   我使用MongoDB v3.0.7和Mongoid 5.0.1,这是我的模型:

class Award
  include Mongoid::Document
  include Mongoid::Elasticsearch

  # Associations
  belongs_to :document
  embeds_one :date, class_name: "AwardDate", inverse_of: :award
  embeds_one :value, class_name: "Value", inverse_of: :award

 accepts_nested_attributes_for :value, :date

  # Fields
 field :title, type: String
 field :description, type: String

 elasticsearch!({
  prefix_name: false,
  index_name: 'awards',
  wrapper: :load
 })
end 

我做错了吗?我在this example on mongo_ruby_driver Github注意到支持$ project聚合,但我尝试使用嵌套和非嵌套属性,结果相同。我意识到我可以通过正常检索来做到这一点,但我更喜欢聚合,因为它们更快,我有一个大数据集。任何想法都将非常感激。

1 个答案:

答案 0 :(得分:3)

Mongoid(v5及更高版本)的现代版本现在使用的是现代mongodb ruby driver而不是旧的&#34;轻便摩托车&#34; Mongoid v3和v4的驱动程序。

这意味着.aggregate()返回一个&#34;光标&#34;,或者特别是Mongo::Collection::View::Readable对象而不是一个普通的对象数组,这与其他现代驱动程序版本一致。

所以迭代&#34;光标&#34;相反,通过标准方式。即:

require "pp"

Award.collection.aggregate( [ {"$project" => { "value.amount"=> 1}} ] ).each do | doc |
    pp doc
end

这将为响应中的每个文档提供这样的输出:

{"_id"=>BSON::ObjectId('564c4836023fb886145f8063'), "value"=>{"amount"=>1.0}}

就像你要求的那样。