Пример #3 Пример использования MongoDB::command() MapReduce
Получение всех пользователей, у которых есть хотя бы одно событие "sale", и сколько раз
каждый из этих пользователей совершил распродажу.
<?php // пример документа о событии$events->insert(array("user_id"=>$id,"type"=>$type,"time"=> newMongoDate(),"desc"=>$description));// конструктор карты и reduce функции$map= newMongoCode("function() { emit(this.user_id,1); }");$reduce= newMongoCode("function(k, vals) { "."var sum = 0;"."for (var i in vals) {"."sum += vals[i];"."}"."return sum; }");$sales=$db->command(array("mapreduce"=>"events","map"=>$map,"reduce"=>$reduce,"query"=> array("type"=>"sale"),"out"=> array("merge"=>"eventCounts")));$users=$db->selectCollection($sales['result'])->find();
foreach ($usersas$user) {
echo"{$user['_id']}принял участие в{$user['value']}распродажах.\n";
}?>
Результатом выполнения данного примера
будет что-то подобное:
User 47cc67093475061e3d9536d2 принял участие в 3 распродажах.
User 49902cde5162504500b45c2c принял участие в 14 распродажах.
User 4af467e4fd543cce7b0ea8e2 принял участие в 1 распродажах.
Замечание:
Использование MongoCode
В этом примере используется MongoCode, который также может
принимать аргумент scope. Однако в настоящее время MongoDB не поддерживает использование
scope в MapReduce. Если вы хотите использовать переменные на стороне клиента в
функциях MapReduce, вы можете добавить их в глобальную область, используя
необязательное поле scope с командой базы данных. Смотрите
» документацию MapReduce
для получения дополнительной информации.
Замечание:
Аргумент out
До 1.8.0 аргумент out был необязательным. Если вы его
не используете, результаты MapReduce будут записаны во временную коллекцию,
которая будет удалена при закрытии вашего соединения. В 1.8.0+ требуется аргумент
out. Смотрите
» документацию MapReduce
для получения дополнительной информации.