MongoDB MapReduce,与“;“同样的方法”;,我';我失踪了?

MongoDB MapReduce,与“;“同样的方法”;,我';我失踪了?,mongodb,mapreduce,Mongodb,Mapreduce,我知道我在MongoDB中缺少MapReduce。我试图建立一个标签频率集合,我得到了不同的结果,即使map和reduce函数似乎是“相同的” 示例文档(忘记值100、45…我没有使用它们): { ... 标签:['Rock',100],'Indie Pop',45],…] } 发出标量值1: var map=函数(){ if(this.tags){ this.tags.forEach(函数(标记){ emit(标记[0],1);//仅发射1 }); } }; var reduce=函数(键,

我知道我在MongoDB中缺少MapReduce。我试图建立一个标签频率集合,我得到了不同的结果,即使
map
reduce
函数似乎是“相同的”

示例文档(忘记值100、45…我没有使用它们):

{
...
标签:['Rock',100],'Indie Pop',45],…]
}
发出标量值
1

var map=函数(){
if(this.tags){
this.tags.forEach(函数(标记){
emit(标记[0],1);//仅发射1
});
}
};
var reduce=函数(键,VAL){//VAL应该是[1,…]
return vals.length;//计算数组的长度
};
mapReduce(map,reduce,{out:'mapReduce_out'});
db.mapreduce_out.find().sort({value:-1}).limit(3);
输出为:

{u id:“rubyrigby1”,“value”:9}
{u id:“Dom”,“value”:7}
{u id:“感觉更好”,“价值”:7}
发出对象
{count:1}

var map=函数(){
if(this.tags){
this.tags.forEach(函数(标记){
emit(标记[0],{count:1});//发射一个对象
});
}
};
var reduce=函数(键,VAL){//VAL应该是[{count:1},…]
var计数=0;
val.forEach(函数(val){
count+=val.count;//Accumul
});
返回{count:count};
};
mapReduce(map,reduce,{out:'mapReduce_out'});
db.mapreduce_out.find().sort({'value.count':-1}).limit(3);
结果不同,似乎是“正确的”:

{u id:“rock”,“value:{“count”:9472}
{“_id”:“pop”,“value”:{“count”:7103}
{u id:“电子”,“值”:{“计数”:5727}

第一种方法有什么问题?

考虑一千个文档的集合,所有文档都带有标记名:

for (var i = 0; i < 1000; i++) {
    db.collection.insert({tags: [['tagname']]});
}
打印输出显示在服务器日志中。reduce函数用前100个1调用,它返回100。到现在为止,一直都还不错。然后MongoDB再次调用它,第一个reduce的输出加上接下来的100个1:

reduce([100, 1, 1, ..., 1]) // 100 plus 100 more 1's
现在返回101,因为这是数组的长度。但很明显,它应该返回200,数组的和。因此,要获得正确的结果,请更改reduce函数:

reduce = function (key, vals) {
    var sum = 0;
    vals.forEach(function(val) { sum += val; });
    return sum;
}

考虑一千个文档的集合,所有文档都带有标记名'tagname':

for (var i = 0; i < 1000; i++) {
    db.collection.insert({tags: [['tagname']]});
}
打印输出显示在服务器日志中。reduce函数用前100个1调用,它返回100。到现在为止,一直都还不错。然后MongoDB再次调用它,第一个reduce的输出加上接下来的100个1:

reduce([100, 1, 1, ..., 1]) // 100 plus 100 more 1's
现在返回101,因为这是数组的长度。但很明显,它应该返回200,数组的和。因此,要获得正确的结果,请更改reduce函数:

reduce = function (key, vals) {
    var sum = 0;
    vals.forEach(function(val) { sum += val; });
    return sum;
}

reduce可以在每个键上运行多次,通过执行
.length
您很可能只得到该键中的最后一批,更具体地说,mongodb可以在每个键上运行reduce,每运行101个结果key@Sammaye谢谢我不太清楚。我在哪里可以找到关于reduce(你正在谈论的东西)内部细节的一些细节?Grr我确实讨厌MongoDb文档有时候,他们从新版本中删除了数学公式,本页提示:“reduce函数必须是幂等的。”我将尝试找到一个合适的链接。再往下解释一点,但仍然很糟糕:reduce可以在每个键上运行多次,通过执行
.length
,您很可能只得到该键中的最后一批,更具体地说,mongodb可以在每个键上运行reduce每101个结果key@Sammaye谢谢我不太清楚。我在哪里可以找到关于reduce(你正在谈论的东西)内部细节的一些细节?Grr我确实讨厌MongoDb文档有时候,他们从新版本中删除了数学公式,本页提示:“reduce函数必须是幂等的。”我将尝试找到一个合适的链接。再往下解释一点,但仍然很糟糕:惊人的解释。还要感谢用户Sammaye提供的文档。知道了!令人惊讶的解释。还要感谢用户Sammaye提供的文档。知道了!