2012-04-02 63 views
0

所以我通过SQL的MongoDB组由(+排序和限制)

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/

这说明如何通过在蒙戈使用组,但它谈如何实现order bylimit一组内。

另外它似乎Mongoid不提供group功能的支持,任何人都知道它的任何不同?

回答

1

的sort_by方法我怎样才能复制此组在MongoDB中。我碰到这个优秀的写作 - http://kylebanker.com/blog/2009/11/mongodb-count-group/

首先,这是一个2岁的写作。这些运营商(count,group,distinct)仍然有效,但速度很慢。使用这些运算符中的任何一个都等于运行Map/Reduce。我不确定这些运营商是否实施了分片(请注意,博客文章的前期分割为)。

现代的做法是使用新的Aggregation Framework。这是更快,并支持分片。但是,它仍然处于不稳定的状态。

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

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

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

  1. 运行M/R拿到count(*) grouped by X
  2. 使用您的sort()skip()limit()对M/R输出执行查询。
  3. 如果您有太多的数据需要排序(〜1M用户),上面的方法可能不起作用,您可能需要对M/R的输出进行索引,以使排序生效。
+0

非常好的答案。这里有一个相似的答案和一些示例代码的相关问题:http://stackoverflow.com/questions/17508826/how-to-query-group-by-and-distinct-with-a-limit-in-mongodb- PHP-笨/ 20395865 – 2013-12-05 09:26:32

0

您应该检查出Mongoid: Querying

它提供了如何使用order_bylimit的解释。

编辑:

删除了评论有关distinctgroup by等同为@mu指出。相反,您应该使用group并提供缩减功能,如链接到的文章中所述。

+0

当涉及集合函数(例如'count')时,Um,“distinct”和“group by”非常不同。 – 2012-04-02 18:35:21

+0

对不起,这是sl。。我确定了我的答案。 – 2012-04-02 18:42:15