2016-10-07 2 views
0

Я пытаюсь объединить несколько значений, испускаемых с моей карты, в пользовательской функции сокращения (rereduce enabled), но я получаю нулевые значения в результате, за исключением нескольких точек данных, где я вижу 0. Буду признателен за любую оказанную помощь. БлагодаряCouchDB - совокупность нескольких значений на этапе уменьшения

Мои данные излучаемые в этом формате:

Key:"dateX" Values:"{'a':435, 'b':5645}" 
Key:"dateX" Values:"{'a':8451, 'b':9245}" 
Key:"dateX" Values:"{'a':352, 'b':450}" 

Key:"dateY" Values:"{'a':5675, 'b':1245}" 
Key:"dateY" Values:"{'a':4455, 'b':620}" 

Я хочу агрегировать/суммируют значения как в & б для Datex и dateY, моя карта-свертка является:

"map": "function(doc){emit(doc.logDate, {'a': doc.a, 'b': doc.b});}", 

"reduce": "function(key, values, rereduce) { 
        var total = {tA:0, tB:0}; 
        if(rereduce){ 
         for(i=0; i<values.length; i++) 
         { 
          total.tA += values[i].a; 
          total.tB += values[i].b; 
         } 
         return total; 
        } 
        total.tA = sum(values.a); 
        total.tB = sum(values.b); 
        return total; }" 
------------------------ 
Results: 
dateX  {tA: 0, tB: 0} 
dateY  {tA: null, tB: null} 
dateZ  {tA: null, tB: null} 
     . 
     . 
     . 

ответ

1

Прежде всего, функция sum ожидает массив как аргумент вместо значений.a, который не определен, поэтому вы можете попробовать

total.tA = sum(values.map(function (value) {return value.a})); 
total.tB = sum(values.map(function (value) {return value.b})); 

Или что-то вроде

values.reduce(function (t, value) { 
    t.tA += value.a; 
    t.tB += value.b; 
    return t; 
}, total); 

Кроме того, когда флаг rereduce включен означает, что уменьшить функцию работы с уже уменьшенными значениями, так

for (i=0; i < values.length; i++) { 
    total.tA += values[i].tA; //not a 
    total.tB += values[i].tB; //not b 
} 

Кроме того, вы должны добавить else предотвратить двойное исполнение в rereduce случай

if (rereduce) { 
    // 
} else { 
    // 
} 

http://guide.couchdb.org/editions/1/en/views.html#reduce

+0

Спасибо @ the4lt Я попробую это, для моей проблемы я исправил это, сделав {tA: 0, tB: 0}; в том же формате, что и «{'a': 4455, 'b': 620}", таким образом метод сокращения работает правильно, и я предполагаю, что он не вызывает повторное использование, поэтому я могу суммировать для цикла и избежать суммы () для агрегирования. –