MapReduce в MongoDB не выводит

Я пытался использовать MongoDB 2.4.3 (также попытался 2.4.4) с mapReduce в кластере с 2 осколками с каждой 3 репликами. У меня проблема с результатами задания mapReduce, которые не сводятся к сборке вывода. Я попробовал Incremental Map Reduce. Я также попытался "слить" вместо сокращения, но это тоже не сработало.

Запуск команды по сокращению карты на mongos: (coll не оштукатурен)

db.coll.mapReduce(map, reduce, {out: {reduce: "events", "sharded": true}})

Что дает следующий результат:

{
    "result" : "events",
    "counts" : {
        "input" : NumberLong(2),
        "emit" : NumberLong(2),
        "reduce" : NumberLong(0),
        "output" : NumberLong(28304112)
    },
    "timeMillis" : 418,
    "timing" : {
        "shardProcessing" : 11,
        "postProcessing" : 407
    },
    "shardCounts" : {
        "stats2/192.168.…:27017,192.168.…" : {
            "input" : 2,
            "emit" : 2,
            "reduce" : 0,
            "output" : 2
        }
    },
    "postProcessCounts" : {
        "stats1/192.168.…:27017,…" : {
            "input" : NumberLong(0),
            "reduce" : NumberLong(0),
            "output" : NumberLong(14151042)
        },
        "stats2/192.168.…:27017,…" : {
            "input" : NumberLong(0),
            "reduce" : NumberLong(0),
            "output" : NumberLong(14153070)
        }
    },
    "ok" : 1,
}

Итак, я вижу, что mapReduce запускается на 2 записи, что приводит к выходу 2 записей. Однако в postProcessCounts для обоих осколков входной счет остается 0. Также попытка найти запись с поиском на _id не дает результата. В файле журнала MongoDB мне не удалось найти сообщения об ошибках, связанные с этим.

Попробовав воспроизвести это с помощью вновь созданной выходной коллекции, я также охарактеризовал hashed _id, и я также дал те же индексы, что я не смог воспроизвести это. При выводе одного и того же ввода в другую коллекцию

db.coll.mapReduce(map, reduce, {out: {reduce: "events_test2", "sharded": true}})

Результат сохраняется в выходной коллекции, и я получил следующий вывод:

{
    "result" : "events_test2",
    "counts" : {
        "input" : NumberLong(2),
        "emit" : NumberLong(2),
        "reduce" : NumberLong(0),
        "output" : NumberLong(4)
    },
    "timeMillis" : 321,
    "timing" : {
        "shardProcessing" : 68,
        "postProcessing" : 253
    },
    "shardCounts" : {
        "stats2/192.168.…:27017,…" : {
            "input" : 2,
            "emit" : 2,
            "reduce" : 0,
            "output" : 2
        }
    },
    "postProcessCounts" : {
        "stats1/192.168.…:27017,…" : {
            "input" : NumberLong(2),
            "reduce" : NumberLong(0),
            "output" : NumberLong(2)
        },
        "stats2/192.168.…:27017,…" : {
            "input" : NumberLong(2),
            "reduce" : NumberLong(0),
            "output" : NumberLong(2)
        }
    },
    "ok" : 1,
}

При повторном запуске script с тем же вводом, который снова появляется во втором сборнике, он показывает, что он уменьшает значение postProcessCounts. Таким образом, функции карты и сокращения выполняют свою работу отлично. Почему он не работает над большей коллекцией? Я здесь что-то не так? Существуют ли какие-либо особые ограничения на коллекции, которые можно использовать в качестве вывода для сокращения карты?

Ответ 1

mapReduce запускается на 2 записи, что приводит к выходу 2 записей. Однако в postProcessCounts для обоих осколков входной счетчик остается 0.

Карта запускается через 2 записи. Если эти две записи имеют другой ключ, тогда Карта выведет 2 клавиши и значение для каждого. Это нормально.

Но что-то, что я заметил в старой версии MongoDB (не уверен, что это применимо в вашем случае) заключается в том, что если "массив значений" для фазы уменьшения имеет длину, то сокращение будет пропущено.

Является ли сбор данных пустым в первом случае?