Функция map должна вызывать функцию emit, которая принимает пару ключ значение. Ключ - это поле, по которому осуществяется группировка. Значения - это значение, которое попадет в функцию reduce.
След. функция reduce, принимает key и vals. Vals - это всегда коллекция, т.к туда пишутся результаты прошлых вызовов выборок. Пример функции reduce
function(key, values) {
var result = {count: 0, likes: 0};
values.forEach(function(value) {
result.count += value.count;
result.likes += value.likes;
});
return result;
}
Есть еще функция function finalize(key, value) -> final_value она будет вызвана после того, как по ключу не будет больше вызываться функции reduce. Это можно использовать, чтоб завершить какие-то финальные дейсвтия. Т.к мы не знаем в функции reduce вызываемся мы последний раз или нет.
Также нужно указать параметр out. Фактически - это куда будет литься результирующая коллекция.
{ replace : "collectionName" } - значение по умолчанию, замена существующей коллекции.
Вот в этом куске кода, над коллекцией payments мы делаем mapReduce, в качестве ключа мы используем payment_time, который сокращен до точности часа. Этот код позволит нам получить количество платежей по часам за весь период, в течении которого совершались платежи.
db.system.js.save({
"_id" : "aggregatePayments",
value: function () {
db.payments.mapReduce(
// функция map
function() {
var k = clone(this.payment_time);
k.setMinutes(0);
k.setSeconds(0);
k.setMilliseconds(0);
emit(k, this.amount);
},
// функция reduce
function (key, vals) {
var total = 0;
for (var i = 0; i < vals.length; i++) {
total += vals[i];
}
return total;
},
{
out : {merge : "chargebackByDay" }
}
);
}
};
На выходе данные запишутся в коллекцию, где в качестве ключей будет использовано точное время, которое мы сократили до часа в функции map, а в качестве значения каждого ключа число total, которое было вычеслено для каждого ключа отдельно на шаге reduce.
Комментариев нет:
Отправить комментарий