Điều quan trọng cần nhớ khi sử dụng mapReduce () rằng giá trị trả về của hàm Reduce () cần phải có cùng hình dạng với giá trị mà bạn mong đợi nhận được trong phần tử 'giá trị' của hàm Reduce () - và điều đó, ngược lại, cần phải có cùng hình dạng với những gì được phát ra bởi hàm release ().
Đưa ra một bộ sưu tập chứa các tài liệu có dạng sau:
> db.posts.count();
1000
> db.posts.findOne();
{
"_id" : 0,
"date_posted" : ISODate("2012-04-04T05:54:44.535Z"),
"topic_id" : "sierra"
}
Đoạn mã sau sẽ tạo ra kết quả bạn muốn:
<?php
$conn = new Mongo("localhost:$port");
$db = $conn->test;
$collection = $db->tst;
$map = new MongoCode(
"function() { emit( this.topic_id, { last_post: this.date_posted } ); }"
);
$reduce = new MongoCode(
"function(key, values) { ".
"var max = ISODate('1970-01-01T00:00:00Z'); ".
"values.forEach(function(val) { ".
"if ( max < val.last_post ) max = val.last_post; ".
"}); ".
"return {last_post : max}; " .
"}"
);
$result = $db->command( array(
"mapreduce" => "posts",
"map" => $map,
"reduce" => $reduce,
"query" => array( "topic_id" => "alpha"),
"out" => array( "merge" => "lastPosts")
)
);
echo "result: "; print_r($result);
$collection = $db->lastPosts;
$cursor = $collection->find()->limit(6);
date_default_timezone_set("UTC");
foreach( $cursor as $doc ) {
$date = date( "r", $doc['value']['last_post']->sec );
echo $doc['_id'] . " last visited at " . $date ."\n" ;
}
?>