0

我有一个包含许多列的集合:col1、col2、WebsiteCode、CreatedDate、col3....、coln。

我想在 CreatedDate 范围内按 WebsiteCode 分组。

所以我这样做:

地图 :

function Map() {
         var key={WebsiteCode:this.WebsiteCode};
         val={Count: 1};
         emit(key,val);
 }

减少 :

function Reduce(key, values) {
var res = {Total:0};
values.forEach(function(value) {
res.Total += value.Count;
});
return res;
}

及查询范围DateTime:

{ "CreatedDate" : { "$gte" : dateFrom , "$lte" : dateTo } }

最后,我运行这个 mapreduce 命令。结果返回的结果不是我所期望的,许多行都有Total = NaN Ex:{_id:{WebsiteCode:"websitecode1"}}, {value:{Total:NaN}}

但是当我运行 count 命令时:

db.collect.find({ "WebsiteCode" : "websitecode1", "CreatedDate" : { "$gte" : dateFrom), "$lte" : dateTo } }).count();

结果返回:927

你能向我解释我做错了什么吗?

4

1 回答 1

0

您的 reduce 函数必须返回一个与发出的值具有相同形状的值。所以你不能Count在 map 和Totalreduce 中使用。

试试这个:

function Reduce(key, values) {
    var res = {Count:0};
    values.forEach(function(value) {
        res.Count += value.Count;
    });
    return res;
}
于 2012-12-28T03:13:30.553 回答