【问题标题】:Aggregate with Mongoid与 Mongoid 聚合
【发布时间】:2012-08-25 16:47:03
【问题描述】:

MongoDB 有一个新的Aggregation Framework,我正在尝试弄清楚如何将它与 Mongoid 一起使用。正如here 所讨论的,似乎有一个具有此功能的 Moped 分支。我已经更新到 MongoDB 2.2 并尝试在我的应用程序上安装这个 Moped 分支,如下所示:

gem '轻便摩托车',git:'git://github.com/mongoid/moped.git',分支: '聚合支持'

但聚合仍然无法正常工作。这是我用来测试它的调用:

= Post.all.aggregate({ "$group" => { "_id" => "$_id" } })

更新

在 mongo shell 中这可以工作:

db.users.aggregate({ $group : { _id : "$_id" }})

所以我认为这是一个 Mongoid 问题...任何关于此的词都会很棒!

【问题讨论】:

  • 是不是因为在外壳上您正在访问用户集合而在 Mongoid 中访问帖子集合? ^^
  • 你试过 Post.collection.aggregate("$group" => { "_id" => "$_id" }) 吗?
  • @neon 您是否获得了使用该分支与 moped 和 mongoid 一起使用的聚合框架,并且您想用解决方案更新您的问题。
  • 您的更新中似乎缺少聚合功能?您是否要求和,找到最小值或最大值或什么?无论如何,在 Mongoid 3.0.x 中,聚合方法“avg”、“max”、“min”和“sum”都记录在这里:mongoid.org/en/mongoid/docs/querying.html#aggregations

标签: ruby-on-rails mongodb mongoid aggregation-framework


【解决方案1】:

自 3.0.1 起,Mongoid 需要 MongoDB 2.2 并支持新的聚合框架。

您现在可以在收藏集上致电aggregate

project = {"$project" => 
  {
    "charges" => 1,
    "year"    => { "$year" => "$created"}, "month" => { "$month" => "$created"},
    "week"    => { "$week" => "$created"}, "day"   => { "$dayOfYear" => "$created"} 
  }
}
group =  { "$group" =>
  { "_id" => {"year"=>"$year", "week"=>"$week"}, "count" => { "$sum" => 1 } } 
}
Charge.collection.aggregate([project,group])

【讨论】:

  • 令人惊讶的是,聚合框架一开始就缺乏。你将如何模仿 mysql/postgresql 聚合函数? (反问)
【解决方案2】:

目前,mongoid 没有提供超出 Moped 公开的额外语法。如果您愿意在 Gemfile 中包含 Moped(指向 master),您可以测试 Moped 对聚合的支持。

gem 'moped', :git => 'git://github.com/mongoid/moped.git'

你要记得在 1.3.0 发布后拉取它,然后通过gem update moped 的正常路径进行更新。

有了这些,您可以使用以下命令运行查询:

 Post.collection.aggregate({ "$group" => { "_id" => "$_id" } })

有关详细信息,请参阅助力车 changelog

【讨论】:

  • 我已经可以在不包括轻便摩托车的情况下做到这一点,我正在使用 5.0.0 gem of mongoid。
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 2018-06-29
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2014-05-27
相关资源
最近更新 更多