2012-04-02 68 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