用于计算参数值的MapReduce

用于计算参数值的MapReduce,map,mapreduce,reduce,mongodb,Map,Mapreduce,Reduce,Mongodb,我有这样的文件: { "_id": ObjectId("4d17c7963ffcf60c1100002f"), "title": "Text", "params": { "brand": "BMW", "model": "i3" } } { "_id": ObjectId("4d17c7963ffcf60c1100002f"), "title": "Text", "params": { "brand": "BMW",

我有这样的文件:

{
   "_id": ObjectId("4d17c7963ffcf60c1100002f"),
   "title": "Text",
   "params": {
     "brand": "BMW",
     "model": "i3"
    }
}

{
   "_id": ObjectId("4d17c7963ffcf60c1100002f"),
   "title": "Text",
   "params": {
     "brand": "BMW",
     "model": "i5"
    }
}
{ key : { 'brand' : 'bmw' }, value : 2 }
{ key : { 'model' : 'i5' }, value : 1 }
我需要的是每个参数值的计数。比如:

brand
---------
BMW (2)

model
---------
i3 (1)
i5 (1)

我想我必须编写map/reduce函数。我该怎么做?谢谢。

在映射函数中,枚举
对象的params属性的属性。对于找到的每个属性,使用包含属性名称和属性值的键调用
emit
。将1作为值传递。e、 g.
emit({'brand','BMW',1)
但显然使用变量而不是常量

在reduce函数中,会向您传递一个键和一个值数组。对这些值求和并返回总和。即使初始数组都是1,也不要尝试使用数组的长度,因为reduce函数可以迭代调用

之后,您可以从结果集合中对结果进行分组,如果性能需要,可以应用索引

我想我必须编写map/reduce函数

是的,你需要一张地图。有关一些简单的map reduce示例,请参阅

对于您的特定情况,您首先需要更改对输出的期望。map/reduce的输出是一个集合。该系列(在您的案例中)的外观如下:

{
   "_id": ObjectId("4d17c7963ffcf60c1100002f"),
   "title": "Text",
   "params": {
     "brand": "BMW",
     "model": "i3"
    }
}

{
   "_id": ObjectId("4d17c7963ffcf60c1100002f"),
   "title": "Text",
   "params": {
     "brand": "BMW",
     "model": "i5"
    }
}
{ key : { 'brand' : 'bmw' }, value : 2 }
{ key : { 'model' : 'i5' }, value : 1 }
要生成此集合,您需要一个“映射”函数和一个“减少”函数。“映射”函数将发出一个键和一个值。键是params的每个元素,值是1的计数。“reduce”函数接受一个键和一个值数组,只返回一个值。您的问题与下面的示例基本相同:


不同参数的集合是小的、有限的和已知的吗?不,它们不是。盖茨副总裁的解决方案奏效了。谢谢