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