Couchbase减少多个值

Couchbase减少多个值,couchbase,couchbase-view,Couchbase,Couchbase View,我正在Couchbase 3.0.1中构建一个视图,并希望减少地图中的多个值,但我不确定正确的方法 对于order对象,我试图解决的问题是,我希望减少映射中的多个值(特别是小计、税和合计)。我首先将值作为对象输出: function (doc, meta) { if (doc.object == "order") { emit(dateToArray(doc.order_date), {subtotal: doc.subtotal, tax: doc.tax, total: doc.

我正在Couchbase 3.0.1中构建一个视图,并希望减少地图中的多个值,但我不确定正确的方法

对于order对象,我试图解决的问题是,我希望减少映射中的多个值(特别是小计、税和合计)。我首先将值作为对象输出:

function (doc, meta) {
  if (doc.object == "order") {
    emit(dateToArray(doc.order_date), {subtotal: doc.subtotal, tax: doc.tax, total: doc.total});
  }
}
但是,这对我帮助不大,因为我不确定在贴图输出自定义对象时如何减少值。显然,内置的_sumreduce函数无法处理它,因此:


是否有人可以提供一些建议,说明如何在Couchbase中减少地图输出中的几个值?

您可以编写自己的自定义减少函数。自定义reduce接受3个参数:

  • 关键点-贴图发出的关键点之一
  • values—为该特定键发出的值数组
  • rereduce—这是对reduce的第一次调用,还是对reduce本身返回的中间值进行聚合的rereduce
  • 在您的例子中,您只需要一个简单的求和,因此reduce的代码与rereduce的代码相同:计算3阶对象属性的和并返回结果。它应该是这样的(从内存中键入,JS语法可能有点不正确)

    reduce(键、值、重减量){
    var结果=值[0];
    对于(变量i=1;i
    完美-正是我所需要的。非常感谢。
    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;
    }