Mongodb地图减少问题

时间:2014-09-01 16:53:41

标签: javascript mongodb mapreduce

我无法解释但是这是发生在我身上的事情:

当我运行以下命令时:

db.rating_predictions.mapReduce(
function(){

if (!this.target_infos){return;}
  for (i=0;i<this.target_infos.length;i++){
        var obj = {
        channel_id:this.channel_id,
        target_audience:this.target_infos[i].name,
        day:parseInt(this.time_slot.getDay())
    }
   emit(obj,this.target_infos[i]);
  }},
function(ids,target_infos){
var res={};
res.thousands = 0.0;
res.rating = 0.0;
//print(target_infos.length);
for (var i=0;i<target_infos.length;i++){
    var thousands = parseFloat(target_infos[i].thousand_viewer);
    var rating = parseFloat( target_infos[i].trp);
    if (isNaN(thousands)){
        thousands=0;
    }
    if (isNaN(rating)){
        rating=0;
    }
        res.thousands+=thousands;
        res.rating+=rating;
    //print(i);

    }         
    return res;
}
,
{

out:{inline:true}
}
)

回应的第一条记录是:

{
"_id" : {
    "channel_id" : ObjectId("53219847091d6601dd000018"),
    "target_audience" : "13-19jaar",
    "day" : 0
},
"value" : {
    "thousands" : 1,
    "rating" : 0.10793
}
}

现在我知道你必须认为你需要查看数据但是,请大开眼界并查看数据。 当我在地图中运行没有channel属性的相同查询时。 意思是:

db.rating_predictions.mapReduce(
function(){

if (!this.target_infos){return;}
  for (i=0;i<this.target_infos.length;i++){
        var obj = {
        //channel_id:this.channel_id, **this is what i removed**
        target_audience:this.target_infos[i].name,
        day:parseInt(this.time_slot.getDay())
    }
   emit(obj,this.target_infos[i]);
  }},
function(ids,target_infos){
var res={};
res.thousands = 0.0;
res.rating = 0.0;
//print(target_infos.length);
for (var i=0;i<target_infos.length;i++){
    var thousands = parseFloat(target_infos[i].thousand_viewer);
    var rating = parseFloat( target_infos[i].trp);
    if (isNaN(thousands)){
        thousands=0;
    }
    if (isNaN(rating)){
        rating=0;
    }
        res.thousands+=thousands;
        res.rating+=rating;
    //print(i);

    }         
    return res;
}
,
{

out:{inline:true}
}
)

我得到以下内容:

{
"_id" : {
    "target_audience" : "13-19jaar",
    "day" : 0
},
"value" : {
    "thousands" : 0,
    "rating" : 0
}
}

现在我非常困惑,对于特定的channel_id我怎么可能在第0天获得评分&gt; 0,并且对于所有频道我得到的评分为0

我检查了

是否有负值
db.rating_predictions.count({"target_infos.trp":{"$lt":0}}) 

结果是0。

我非常感谢帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

我明白了 res对象必须与reduce函数的第二个param具有相同的字段,因此更改 名字

 var res={};
res.thousand_viewer = 0.0;
res.trp = 0.0;