2013-04-29 44 views
2

我想要統計與ID相關的文檔數量,然後對結果進行排序。這是一個示例文檔(在media集合中)。Group然後用MongoDB排序

{ 
    "_id" : "00wlz2j2cu9kx", 
    "uploadedBy" : { 
    "uid" : "00wen1b4tfwn6", 
    } 
} 

基本上,我需要將所有這些文獻的由uploadedBy.uid,排序由文檔的計數所得到的數組。到目前爲止,我有這個命令:

db.media.group({ 
    key: { 
    'uploadedBy.uid' : true 
    }, 

    reduce: function(obj, prev) { 
    prev.total += 1 
    }, 

    initial: { 
    total: 0 
    } 
}) 

這給了我這個數組作爲結果。

[ 
    { 
    "uploadedBy.uid" : "00wen1b4tfwn6", 
    "total" : 1 
    }, 
    { 
    "uploadedBy.uid" : "00wp0s9c73dvl", 
    "total" : 2 
    } 
] 

現在我只需要由total字段進行排序這些文檔。我該怎麼做呢?

+0

我想這將取決於你正在使用的驅動程序。 – 2013-04-29 19:42:39

+0

我正在使用Node.js驅動程序。 – 2013-04-29 19:43:12

+0

然後,我恐怕我不能幫你,我與Java工作:) – 2013-04-29 19:44:03

回答

2

在情況下,如果Node.js的支持聚合框架嘗試使用它

db.media.aggregate([ 
    {$group: {_id: '$uploadedBy.uid', 'count': {$sum: 1}}}, 
    {'$sort': {'count': -1}} 
]) 

我不知道,這個代碼沒有問題,但你可以嘗試這樣的事情。

編輯 更改查詢正常工作。這個答案對我有用。您還可以在這裏添加跳過/極限以獲得前5名的結果,如下圖所示:,

db.media.aggregate([ 
    {$group: {_id: '$uploadedBy.uid', 'count': {$sum: 1}}}, 
    {'$sort': {'count': -1}}, 
    {'$skip': 0}, 
    {'$limit': 5} 
]) 
+1

聚合查詢錯誤,您正在使用uid並將其計爲_id,這將無法正常工作 – 2013-04-30 03:17:37

+0

對不起,對,您對了 – dyrkin 2013-04-30 05:28:01

+0

謝謝@dyrkin的答案爲我工作 – Rohit 2014-04-07 13:24:46

3

我會建議使用Aggregation Framework此,如果您的MongoDB的版本> = 2.1。許多簡單的聚合查詢比使用MapReduce更容易編寫(您正在使用的group()函數使用的是MapReduce)。

的聚合框架提供了一種簡便$排序選項訂購您的結果,具體如下:

var MongoClient = require("mongodb").MongoClient; 

MongoClient.connect("mongodb://localhost/myDb", function (err, db) { 
    "use strict"; 
    var collection = db.collection("media"), 
     resultsHandler = function (err, results) { 
      if (err) { 
       console.log(err); 
      } 
      console.log(results); 
     }; 

    collection.aggregate(
     { 
      $group: { 
       _id: { uid: "$uploadedBy.uid" }, 
       total: { $sum: 1 } 
      } 
     }, 
     { 
      $sort: { 
       total: -1 
      } 
     }, 
     resultsHandler 
    ); 
}); 
+1

你應該使$ group _id只是「$ uploadedBy.uid」 - 沒有理由它是一個嵌入式文檔 – 2013-04-30 03:18:32

+0

好點;只是在使用多列鍵:) – 2013-04-30 05:38:41