2

我正在尝试计算与 ID 关联的文档数量,然后对结果进行排序。这是一个示例文档(在media集合中)。

{
  "_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字段对这些文档中的每一个进行排序。我该怎么做呢?

4

2 回答 2

3

如果您的 MongoDB 版本 >= 2.1,我建议为此使用聚合框架。与 MapReduce 相比,许多简单的聚合查询更容易用它编写(您当前使用的 group() 函数在后台使用 MapReduce)。

聚合框架提供了一个简单的 $sort 选项来对结果进行排序,如下所示:

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
    );
});
于 2013-04-29T21:46:34.660 回答
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}
])
于 2013-04-29T20:00:00.640 回答