Карта / сокращение finalize () не всегда получает одинаковое количество параметров - PullRequest
0 голосов
/ 19 декабря 2011

При использовании map / lower на MongoDb 2.0.1 кажется, что метод finalize не всегда вызывается с одинаковыми аргументами.

Я выполняю регулярный подсчет + среднее значение в конце.

var m = function() {
    emit(this.testName, {
        worked: Number(this.testStatus == "WORKED"),
        failed: Number(this.testStatus == "FAILED"),
        done: Number(this.testStatus == "DONE"),
        count: 1
    });
}

var r = function(key, values) {
    var result = {
        worked: 0,
        failed: 0,
        done: 0,
        count: 0
    }

    values.forEach(function(value) {
      result.worked += value.worked;
      result.failed += value.failed;
      result.done += value.done;
      result.count += value.count;
    });

    return result;
}

var f = function(key, value) {
    data = value || key;
    data.workedMean = data.worked / data.count;
    return data;
}

var cmd = {
    mapreduce: "tests",
    map: m,
    reduce: r,
    finalize: f,
    out: {
        reduce: "fromMongo"
    },
    jsMode: true
}

Когда коллекция fromMongo пуста, f () вызывается только с одним аргументом, value.Когда fromMongo уже имеет значения (обратите внимание, что я использую reduce в качестве моего out параметра map / Reduce), метод f () получает два аргумента: key и value.

Isчто такое известное поведение?Мне удалось два заставить его работать, используя data = value || key;, но я не думаю, что это решение.

1 Ответ

0 голосов
/ 21 декабря 2011

эта проблема связана с разницей в вызове finalize между jsMode и non-jsMode (что происходит во время постобработки в режиме «уменьшить»). Обходной путь - не использовать jsMode: true, в этом случае его всегда следует вызывать с помощью (ключ, значение).

Создана проблема с сервером: https://jira.mongodb.org/browse/SERVER-4535

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