【发布时间】:2016-02-19 22:17:33
【问题描述】:
我正在尝试使用 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 聚合,但我尝试过使用嵌套和非嵌套属性,结果相同。我意识到我可以通过正常的检索来做到这一点,但我更喜欢聚合,因为它们更快而且我有一个大数据集。任何想法将不胜感激。
【问题讨论】:
标签: ruby mongodb mongoid aggregation-framework