MongoDB group by(+ sort& limit)

时间:2012-04-02 18:13:53

标签: ruby-on-rails ruby ruby-on-rails-3 mongodb mongoid

所以我有SQL的以下组

select count(*) as NO_OF_MSGS,FROM_USER,PROFILE_IMG,MSG from MESSAGES group by FROM_USER order by NO_OF_MSGS desc,DATE_SENT limit ?,?

如何在MongoDB中复制此组。我遇到了这篇优秀的写作 - http://kylebanker.com/blog/2009/11/mongodb-count-group/

这显示了如何在Mongo中使用group by,但谈论如何在组内实现order bylimit

似乎Mongoid不支持group功能,任何人都知道它有什么不同吗?

3 个答案:

答案 0 :(得分:2)

对于分组,您可以使用rails的group_by方法

http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_by

对于订购,您可以使用Array的sort_by方法

http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-sort_by-21

答案 1 :(得分:1)

  

如何在MongoDB中复制此组。我遇到了这篇优秀的写作 - http://kylebanker.com/blog/2009/11/mongodb-count-group/

首先,这是一篇2年前的报道。这些运算符(countgroupdistinct)仍然可以运行,但速度非常慢。使用任何这些运算符相当于运行Map / Reduce。而且我不确定是否已经为这些运营商实施了分片(请注意博客帖子在分片之前)。

这样做的现代方法是使用新的Aggregation Framework。这要快得多,并且支持分片。但是,它仍处于不稳定的构建中。

  

这显示了如何在Mongo中使用group by,但它没有讨论如何在组内实现order by和limit。

您要转换的查询是SQL中的简单查询,但这不是MongoDB中的简单查询。 Mongoid可能遇到的问题只是你正在做一些MongoDB根本不支持的事情(在新的聚合框架之外)。

如果您无权访问聚合框架,则需要分多步执行此操作。

  1. 运行M / R以获取count(*) grouped by X
  2. 使用sort()skip()limit()对M / R输出进行查询。
  3. 如果您有太多要排序的数据(~1M用户),上述操作可能无效,您可能需要索引M / R的输出才能使排序生效。

答案 2 :(得分:0)

您应该查看Mongoid: Querying

它解释了如何使用order_bylimit

编辑:

删除了关于distinctgroup by等同于@mu指出的评论。相反,您应该使用group并提供reduce函数,详见您链接的文章。