Couchbase 减少多个值
Couchbase reduce multiple values
我正在 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 reduce 函数不会处理它,所以:
有人可以就从 Couchbase 中的地图输出中减少多个值的最佳方法提供一些建议吗?
您可以编写自己的自定义 reduce 函数。自定义 reduce 接受 3 个参数:
- key - 地图发出的键之一
- values - 为该特定键发出的值数组
- rereduce - 这是对 reduce 的首次调用,还是对 reduce 本身返回的中间值进行聚合的 re-reduce。
在您的情况下,您只需要一个简单的总和,因此 reduce 的代码与 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;
}
我正在 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 reduce 函数不会处理它,所以:
有人可以就从 Couchbase 中的地图输出中减少多个值的最佳方法提供一些建议吗?
您可以编写自己的自定义 reduce 函数。自定义 reduce 接受 3 个参数:
- key - 地图发出的键之一
- values - 为该特定键发出的值数组
- rereduce - 这是对 reduce 的首次调用,还是对 reduce 本身返回的中间值进行聚合的 re-reduce。
在您的情况下,您只需要一个简单的总和,因此 reduce 的代码与 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;
}