我可能对此有点不知所措,因为我仍在学习 MongoDB 的来龙去脉,但这里有。
现在我正在开发一种工具来搜索/过滤数据集,按任意数据点(例如流行度)对其进行排序,然后按 id 对其进行分组。我认为我能做到这一点的唯一方法是通过 Mongo 的 MapReduce 功能。
我不能使用 .group() 因为我正在使用超过 10,000 个键,而且我还需要能够对数据集进行排序。
我的 MapReduce 代码运行良好,除了一件事:排序。排序根本不想工作。
db.runCommand({
'mapreduce': 'products',
'map': function() {
emit({
product_id: this.product_id,
popularity: this.popularity
}, 1);
},
'reduce': function(key, values) {
var sum = 0;
values.forEach(function(v) {
sum += v;
});
return sum;
},
'query': {category_id: 20},
'out': {inline: 1},
'sort': {popularity: -1}
});
我已经在流行数据点上有一个降序索引,所以它肯定因为缺少它而不起作用:
{
"v" : 1,
"key" : { "popularity" : -1 },
"ns" : "app.products",
"name" : "popularity_-1"
}
我只是无法弄清楚为什么它不想排序。
由于此功能的工作方式,我无法将结果集内联,而是将其输出到另一个集合,然后对其运行 .find().sort({popularity: -1}) 。