【发布时间】:2012-08-18 01:25:30
【问题描述】:
我可能对此有点不知所措,因为我仍在学习 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}),因为此功能的工作方式。
【问题讨论】:
-
你考虑过使用2.2和聚合框架吗?
-
内联 Map/Reduce 目前不支持排序(请参阅 SERVER-3973 以观看/投票对此功能)。内联 Map/Reduce(或聚合查询)也被限制为最大文档大小(目前 MongoDB 2.0 中为 16Mb)。阻止输出到可以按排序顺序查询的临时集合的问题是什么?另一种选择是在您的客户端应用程序中对结果进行排序,例如使用usort()。
-
@Aysa:我有,但是 2.2 还没有准备好生产。
-
@Stennie:似乎是这样。阻止我将其输出到临时集合的问题是我不能让这个功能为进入应用程序的每个请求创建一个新集合。 Mongo 文档读起来不像我可以创建一个“临时”集合。当然,我可以在完成后删除它,但这似乎不是一个很好的解决方案。而且我完全不担心 16MB 的文档大小限制。
-
@JonUrsenbach:本周发布了 MongoDB 2.2 的第二个候选版本(rc1,继 7 月中旬的 rc0)。我预计生产版本不远了。值得测试。
标签: mongodb mongodb-php mongodb-query