Couchbase уменьшает несколько значений

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

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

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

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

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


person ski_junkie    schedule 22.02.2015    source источник


Ответы (1)


Вы можете написать свою собственную функцию сокращения. Пользовательское сокращение принимает 3 параметра:

  1. key - один из ключей, выдаваемых картой
  2. values ​​- массив значений, выдаваемых для этого конкретного ключа
  3. 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;
}
person David Ostrovsky    schedule 23.02.2015
comment
Идеально - именно то, что мне было нужно. Спасибо! - person ski_junkie; 23.02.2015