然后使用MongoDB排序

时间:2013-04-29 19:40:10

标签: node.js mongodb

我正在尝试计算与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字段对每个文档进行排序。我该怎么做?

2 个答案:

答案 0 :(得分:3)

如果您的MongoDB版本> = 2.1,我建议您使用Aggregation Framework。许多简单的聚合查询使用它更容易编写,而不是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
    );
});

答案 1 :(得分: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}
])