Уменьшение карты на mongodb возвращает рекурсивный результат

У меня есть коллекция недвижимости, и я запускаю уменьшение карты на mongodb, чтобы рассчитать базовую статистику. Все отлично работает локально, но когда я запускаю задачу на mongohq, я получаю рекурсивный результат.

Позвольте мне немного упростить ситуацию, вместо реального сокращения fn скажем, что сокращение равно:

function(key, values) {
  return { values: values };
}

Функция карты:

function() {
  emit('price', this.price);
}

Когда я запускаю задачу локально, вывод выглядит так:

{
  "values": [
    1024.1712707182319,
    661.0377201728149,
    651.5957446808511,
    1553.7073816617014,
    1128.664171911323
  ]
}

Теперь самое интересное, когда я запускаю его в производственной базе данных, вывод выглядит так:

{
  "values": [
    {
      "values": [
        {
          "values": [
            1561.5615615615618,
            1026.2054507337525,
            1428.5714285714287
          ]
        },
        1092.1177587844254,
        1040.2010050251256,
        1547.6190476190477
      ]
    }
  ]
}

Есть идеи, что здесь может быть не так?


person rodic    schedule 02.11.2015    source источник


Ответы (1)


Виновником, вероятно, является ваша функция reduce.

https://docs.mongodb.org/manual/reference/command/mapReduce/#dbcmd.mapReduce

функция редукции должна быть идемпотентной. Убедитесь, что следующее утверждение верно:

reduce( key, [ reduce(key, valuesArray) ] ) == reduce( key, valuesArray )

функция редукции должна быть коммутативной: то есть порядок элементов в массиве значений не должен влиять на вывод функции редукции, так что следующее утверждение верно:

reduce( key, [ A, B ] ) == reduce( key, [ B, A ] )

Надеюсь это поможет,

person jpaljasma    schedule 02.11.2015
comment
Большое спасибо. Я думаю, что это проблема. Однако я приму ваш ответ, как только подтвержу его. Думаю, мне придется написать сокращение таким образом, чтобы оно возвращало объект (в основном хэш) и было идемпотентным. - person rodic; 04.11.2015