2015-02-22 2 views
1

Я создаю представление в Couchbase 3.0.1 и хотел бы уменьшить несколько значений с карты, но я не уверен в правильном подходе.Couchbase уменьшить несколько значений

В случае объекта заказа проблема, которую я пытаюсь решить, заключается в том, что я хотел бы уменьшить несколько значений с карты (в частности, промежуточный итог, налог и сумма). Я начал выводить значения в качестве объекта:

function (doc, meta) { 
    if (doc.object == "order") { 
    emit(dateToArray(doc.order_date), {subtotal: doc.subtotal, tax: doc.tax, total: doc.total}); 
    } 
} 

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

Может ли кто-нибудь предложить совет по наилучшему способу уменьшить несколько значений с выхода карты в Couchbase?

ответ

2

Вы можете написать свою собственную функцию уменьшения. Обычай уменьшить принимает 3 параметра:

  1. ключ - один из ключей, испускаемых карте
  2. значения - массив значений, испускаемых для конкретного ключа
  3. rereduce - это ли первый вызов, чтобы уменьшить, или повторное уменьшение, которое агрегирует промежуточные значения, возвращаемые самим сокращением.

В вашем случае вам просто нужна простая сумма, поэтому код для сокращения такой же, как и rereduce: вычисление суммы свойств объекта 3-го порядка и возврат результата. Он должен выглядеть примерно так (ввод из памяти, синтаксис JS может быть слегка отключен.)

reduce(key, values, rereduce) { 
    var result = values[0]; 

    for(var i = 1; i < values.length; i++) { 
    result.subtotal += values[i].subtotal; 
    result.tax += values[i].tax; 
    result.total += values[i].total; 
    } 

    return result; 
} 
+0

Совершенный - именно то, что мне нужно. Спасибо! –