losaped
@losaped
Пьяный самурай

Как правильно написать mapReduce для MongoDB?

Добрый день. Помогите пожалуйста разобраться. Есть коллекция bankGuarantee
пишу вот так mapReduce:
var map = function(){
    var key = {
        regNum: this.regNumber,
        bank_name: this.bank.shortName,
        bank_inn: this.bank.INN,
        year: this.guarantee.guaranteeDate.getFullYear(),   //Дата выдачи БГ.Год
        month: this.guarantee.guaranteeDate.getMonth(),     //Дата выдачи БГ.Месяц
        category: getCategory(this.guarantee.guaranteeAmount)
    };
    
    emit(key, {count:1, bg_amount: this.guarantee.guaranteeAmount /*,Сумма контракта*/});
}

var reduce = function(key, values){
    var bg_count = 0;
    var bg_amount = 0;
    
	values.forEach(function(value) {
		bg_count += value['count'];
		bg_amount += value['bg_amount'];
	});
	
	return {count: bg_count, amount: bg_amount};
}

db.bankGuarantee.mapReduce(map, reduce, {out: 'bg_stats'});

не могу понять некоторые моменты:
1. в ключе есть поле regNum: this.regNumber, но оно мне не нужно в ключе, мне нужно, чтобы для всех ключей count считался по среднему, типа avg в sql если в ключе документ с одним и тем же кодом встречается n раз, то count по этим документам должен равняться одному, как это правильно написать?
2. year: this.guarantee.guaranteeDate.getFullYear() поле guaranteeDate в некоторых документах может или отсутствовать или называться по другому, как лучше обработать такую ситуацию?
3. Еще и год в результате возвращается как Double как сделать, чтобы целое число было?
  • Вопрос задан
  • 347 просмотров
Решения вопроса 1
longclaps
@longclaps
если в ключе документ с одним и тем же кодом встречается n раз, то count по этим документам должен равняться одному
Что ты имеешь в виду, Роман?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы