我有这段代码:
// 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),并将每个不同的日期放在一个新集合中。
答案 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()
对象时,您就会知道自己处于正确的轨道上。