2013-04-29 41 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