{:"value.amount"=> 1}} ] ) 返回:-6ren">
gpt4 book ai didi

ruby - Mongoid $project 聚合不返回任何东西

转载 作者:太空宇宙 更新时间:2023-11-03 18:11:16 24 4
gpt4 key购买 nike

我正在尝试使用 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 聚合,但我尝试使用嵌套属性和非嵌套属性得到相同的结果。我意识到我可以通过正常检索来做到这一点,但我更喜欢聚合,因为它们更快,而且我有一个大数据集。任何想法将不胜感激。

最佳答案

现代版本的 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}}

就像你要求的那样。

关于ruby - Mongoid $project 聚合不返回任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33775656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com