【问题标题】:MongoDB group by (+ sort & limit)MongoDB 分组依据(+ 排序和限制)
【发布时间】:2012-04-02 18:13:53
【问题描述】:

所以我有以下 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 功能的支持,有人知道它有什么不同吗?

【问题讨论】:

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


    【解决方案1】:

    对于分组,您可以使用 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

    【讨论】:

      【解决方案2】:

      如何在 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. 如果要排序的数据过多(约 100 万用户),上述方法可能不起作用,您可能需要为 M/R 的输出建立索引才能进行排序。

      【讨论】:

      【解决方案3】:

      您应该查看Mongoid: Querying

      它解释了如何使用order_bylimit

      编辑:

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

      【讨论】:

      • 嗯,“distinct”和“group by”在涉及聚合函数(如count)时是很不一样的。
      • 对不起,那太草率了。我修正了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 2018-08-19
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      相关资源
      最近更新 更多