Карта MongoDB уменьшает выдачу другого результата на db.collection.find () - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть карта уменьшения:

карта:

function() {
        emit(this.username, {sent:this.sent, received:this.received});
}

уменьшение:

function(key, values) {                                                                                                                                                                                                         
    var result = {sent: 0, received: 0, entries:0};

    values.forEach(function (value) {
        result.sent += value.sent;
        result.received += value.received;
        result.entries += 1;
    });

    return result;
}

Я отслеживал количество обработанных записей вКарта результатов, как вы можете видеть.Я обнаружил, что получаю гораздо меньшее количество записей, к которым обращаюсь, чем должен.

Для моего конкретного набора данных вывод выглядит примерно так:

[{u'_id ': u'1743', u'value': {u'ceived ': 1406545.0, u'sent': 26251138.0, u'entries ': 316.0}}]

Поскольку я запускаю карту, уменьшите ее с помощью параметра запроса,указав имя пользователя и диапазон дат.

Если я выполню тот же запрос с помощью db.collection.find (), как указано ниже, число будет другим:

> db.entire_database.find({username: '1743', time : { $lte: ISODate('2011-08-12 12:40:00'), $gte: ISODate('2011-08-12 08:40:00') }}).count()                        
1915

Полный запрос на уменьшение картыэто:

db.entire_database.mapReduce(m, r, {out: 'myoutput', query: { username: '1743', time : { $lte: ISODate('2011-08-12 12:40:00'), $gte: ISODate('2011-08-12 08:40:00') } }  })

Так что, в принципе, я не уверен, почему счет так радикально отличается?Почему find () дает мне 1915, а уменьшение карты - 316?

1 Ответ

4 голосов
/ 06 сентября 2011

Ваша функция map должна излучать объект той же формы, что и функция reduce (т. Е. Поле entries должно иметь значение 1).Вы можете прочитать больше об этом здесь .

По сути, значения, которые передаются в функцию reduce, не обязательно являются необработанными выходными данными, полученными из map.Вместо того, чтобы вызываться один раз, функция reduce вызывается много раз для «групп» значений, создаваемых map, результаты которых затем снова объединяются путем передачи в последующий вызовreduce функция.Это то, что делает MapReduce горизонтально масштабируемым, потому что любая группа переданных значений может быть передана на любой сервер в любом порядке перед объединением позже.

Поэтому я бы немного изменил ваши функции следующим образом:

map:

function() {
    emit(this.username, {sent:this.sent, received:this.received, entries : 1});
}

уменьшите:

function(key, values) {                                                                                                                                                                                                         
    var result = {sent: 0, received: 0, entries:0};

    values.forEach(function (value) {
        result.sent += value.sent;
        result.received += value.received;
        result.entries += value.entries;
    });

    return result;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...