我无法解释但是这是发生在我身上的事情:
当我运行以下命令时:
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。
我非常感谢帮助,谢谢。
答案 0 :(得分:0)
我明白了 res对象必须与reduce函数的第二个param具有相同的字段,因此更改 名字
var res={};
res.thousand_viewer = 0.0;
res.trp = 0.0;