使用内联结果在Map/Reduce之后排序



在尝试了这个解决方案并进一步了解之后,我对mongodb又有了一个问题。

我的问题是:

如何对的输出进行排序

doc = {_id : 16, days : { 1 : 123, 2 : 129, 3 : 140, 4 : 56, 5 : 57, 6 : 69, 7 : 80 }};
db.so.insert(doc);
map = function() {
  emit(this._id, this.days["1"]);
  emit(this._id, this.days["3"]); 
  emit(this._id, this.days["7"]); 
}
reduce = function (k, vals) {
  var sum = 0;
  vals.forEach(function (v) {sum += v;});
  return sum;
}
res = db.so.mapReduce(map, reduce, {out : {inline : 1}});
res.find();

输出如下:

"results" : [
    {
            "_id" : 16,
            "value" : 225
    },
    {
            "_id" : 33,
            "value" : 230
    },
    {
            "_id" : 302,
            "value" : 274
    }

]

现在我想用对结果进行排序

res.find().sort({ "results.value":-1 });

导致此错误:

Sat Mar 31 01:15:45 TypeError: res.find().sort({'results.value':-1}) is not a function (shell):1

有人能帮我吗?

下面是一个使用MongoDB 2.2聚合框架的相同查询示例:

db.so.aggregate(
  { $project : {
     '_id' : 1,
     'value' : { $add : ["$days.1","$days.3","$days.7"] },
  }},
  { $sort: { 'value': -1 }}
)

输出:

{
    "result" : [
        {
            "_id" : 302,
            "value" : 274
        },
        {
            "_id" : 33,
            "value" : 230
        },
        {
            "_id" : 16,
            "value" : 225
        }
    ],
    "ok" : 1
}

对于inline结果,这不会以这种方式工作。相反,请尝试写入集合,然后对该集合运行排序。

res = db.so.mapReduce(map, reduce, {out : "tmpResults"});
db.tmpResult.find().sort({value:-1});

您可以完全对results属性进行排序:

res = db.so.mapReduce(map, reduce, {out : {inline : 1}});
res.results.sort(function (a, b) {
    if (a.value == b.value) {
        return 0;
    }
    return a.value < b.value ? -1 : 1;
});

相关内容

  • 没有找到相关文章

最新更新