MongoDB,MapReduce和排序

问题描述 投票:10回答:2

由于我仍在学习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})。] >

我可能仍会对此感到不知所措,因为我仍在学习MongoDB的来龙去脉,但是这里有。现在,我正在使用一种工具来搜索/过滤数据集,并通过任意......>

mongodb mongodb-php mongodb-query
2个回答
15
投票

首先,Mongo map / reduce并非旨在用作查询工具(就像在CouchDB中一样),它是为您运行后台任务而设计的。我在工作时使用它来分析流量数据。

然而,您做错的是您正在将sort()应用于输入,但这是没有用的,因为完成map()阶段后,中间文档将按每个keys进行排序。因为您的密钥是文档,所以正在按product_idpopularity进行排序。


9
投票

如关于原始问题的讨论中所述:

© www.soinside.com 2019 - 2024. All rights reserved.