MongoDB中MapReduce中的Couting行

MongoDB中MapReduce中的Couting行,mongodb,Mongodb,我创建了下面的地图,遇到了一些奇怪的事情。我用两种不同的方法计算每个日期的文档数,得出不同的值。以下是我的职能: map : function Map() { emit( this.cDate,//Holds a date value { count: 1, } ); } reduce : function Reduce(key, values) { var reduced = {count:0,coun

我创建了下面的地图,遇到了一些奇怪的事情。我用两种不同的方法计算每个日期的文档数,得出不同的值。以下是我的职能:

map : function Map() {
    emit(
        this.cDate,//Holds a date value
        {
        count: 1, 
        }
    );
}

reduce : function Reduce(key, values) {
    var reduced = {count:0,count1:0};
    values.forEach(function(val) {
        reduced.count += val.count; 
        reduced.count1++;
    });

return reduced;
}

finalize : function Finalize(key, reduced) {
    return reduced;
}

query : { "cDate" : { "$gte" : ISODate("2012-11-20T00:00:00Z") } }

out : { inline : 1 }
所以基本上奇怪的是,最后“count”和“count1”返回不同的值。“count”的值正确,即该日期的文档数,而“count1”的值要低得多。有人能解释一下吗(我是MongoDB新手,所以请使用简单的术语:-) 谢谢。

两个问题(实际上是同一个问题):

  • 发射格式必须与发射函数中返回的结果相同

  • 必须准备好为同一个键多次调用reduce(即,如果为一个键减少五个值,然后为一个键减少三个值,则可能会再次调用reduce函数以减少前面两次reduce操作的结果)

您的示例只是演示了如果您假设始终减少结果“1”,而不是之前实际发出或减少的结果,会发生什么


参考:

Hi 1。即使我将Count1添加到emit,也会得到相同的结果2。“Count1”不是等于或大于“count”吗如果多次调用reduce?不,您是将count1增加1,而不是在count中传递-您假设count始终为1,事实并非如此。好吧,那么您的意思是,即使我定义了“count:1”在emit中,我不会总是在reduce中得到1,因为它可能是reduce上的reduce。是吗?谢谢。我有一个相关的问题,但明天我会为它打开一个新的问题。Asya,也许你可以看看这个问题的后续问题