无法使Map / Reduce与MongoDB一起使用

时间:2011-11-07 13:44:48

标签: php mongodb

我有这段代码:

// construct map and reduce functions
$map = new MongoCode("
    function() { ".
        "var key = {date: this.timestamp.getFullYear()+this.timestamp.getMonth()+this.timestamp.getDate()};".
        "emit(key, {count: 1});
    }"
);

$reduce = new MongoCode("
    function(k, vals) { ".
        "var sum = 0;".
        "for (var i in vals) {".
            "sum += vals[i];". 
        "}".
        "return sum;".
    "}"
);

$dates = $db->command(array(
    "mapreduce" => "items", 
    "map" => $map,
    "reduce" => $reduce,
    //"query" => array("type" => "sale"),
    "out" => array("merge" => "distinct_dates")
    )
);

但在测试时会出现此错误:

  

Array([assertion] => map invoke failed:JS错误:TypeError:this.timestamp.getFullYear不是函数nofile_b:0 [assertionCode] => 9014 [errmsg] => db断言失败[ok] ] => 0)Cron跑完了。

集合中的每个对象都有一个时间戳,我想从中提取日期(Ymd),并将每个不同的日期放在一个新集合中。

2 个答案:

答案 0 :(得分:0)

在MongoDB中,您无法按原样存储Date对象。我想,你的时间戳有int类型。我希望,如果你定义你的地图功能,一切都会好的:

$map = new MongoCode("
    function(){
         var date = new Date(this.timestamp * 1000) //JS Date need milliseconds 
         var key = date.getFullYear() + date.getMonth() + date.getDate();
         emit(key, {count: 1})
    }
")

答案 1 :(得分:0)

问题在于您的“时间戳”字段的类型不正确。如果您将其存储为纯字符串,请执行以下操作:

"timestamp" : "Wed May 05 2010 15:37:58 GMT-0400 (EDT)"

您将收到此错误消息。将其更改为以下内容将使您的地图按预期工作:

new Date("Wed May 05 2010 15:37:58 GMT-0400 (EDT)")

当您在Mongo的输出中看到它存储为ISODate()对象时,您就会知道自己处于正确的轨道上。