【问题标题】:Mongoid $project aggregation doesn't return anythingMongoid $project 聚合不返回任何内容
【发布时间】: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


    【解决方案1】:

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

    这意味着.aggregate() 返回一个“光标”,或者具体来说是一个Mongo::Collection::View::Readable 对象,而不是一个普通的对象数组,这与其他现代驱动程序版本一致。

    因此,通过标准方式迭代“光标”。即:

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

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

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

    如你所愿。

    【讨论】:

    • 确实如此。但不适用于 {"$project" =&gt; { "document.document_attribute"=&gt; 1}} 。嵌套是否仅适用于嵌入式文档而不适用于相关文档?
    • @Georgiana.b 我认为您需要 Ask another question 将其放在上下文中。您的问题的结果是因为您试图检查一个不直接公开结果的对象,并表明您需要在检查之前公开结果。但是对象嵌套在这里没有任何区别,如果你没有从不同的情况下得到预期的结果,还有其他原因。因此,如果还不清楚,请提出另一个问题以明确表示。
    • 你是对的。如果进一步挖掘没有找到答案,会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2019-04-06
    • 2012-02-15
    • 2020-09-07
    相关资源
    最近更新 更多