mapReduce与日期奇怪的行为

时间:2014-09-26 08:38:16

标签: mongodb symfony mapreduce doctrine

<< 大家好,

我使用Symfony2(所以是Doctrine)和MongoDB。我试图按日期“分组”我的结果。 我发现了一个功能,但它的行为很奇怪。

代码:

    $qb = $this->dm->createQueryBuilder('Friends');
    $qb->map(new \MongoCode("function(){
                var date = this.creationDate;
                date.setHours(0);
                date.setMinutes(0);
                date.setSeconds(0);
                day = date.getDate();
                if(day < 10){
                    day = '0'+day;
                }
                month = 1 + date.getMonth();
                if(month < 10){
                    month = '0'+month;
                }
                day = day+'/'+month+'/'+date.getFullYear();
                emit(day, 1);
    }"));
    $qb->reduce(new \MongoCode("function(k, vals) {
                       var count = 0;
                       for(v in vals) {
                            count += 1;
                        };

                      return count;
                    }"
    ));
    $qb->sort("creationDate","desc");

结果:

  

[timeMillis] =&gt; 96 [计数] =&gt;数组([input] =&gt; 2830 [emit] =&gt; 2830 [reduce] =&gt; 74 [输出] =&gt; 79)[ok] =&gt; 1))

输入和发射都很好。但我不明白为什么减少和输出是不同的。 更多的是当我试图对所有结果进行循环时,总数是不同的。

谢谢你

2 个答案:

答案 0 :(得分:0)

我认为 reduce 功能应该是

$qb->reduce(new \MongoCode("function(k, vals) {
                  return Array.sum(vals);
                }"
));

答案 1 :(得分:0)

我修复了

替换地图功能
 var count = 0;
 vals.forEach(function(v) {
    count += v['count'];
 });

return {count: count};

并发出:

 emit(date, { count: 1 });

感谢您的帮助!