CouchDB:有条件地将 Map/Reduce 输出中的值更改为负数

CouchDB: conditionally changing a value in Map/Reduce output to a negative

我在 CouchDB 1.6.1 中的类别中有数字数据。

文档看起来像这样:

{
category1: "xxx",
category2: "yyy",
category3: "zzz",
value1: 20
}
{
category1: "xxx",
category2: "bbb",
category3: "ccc",
value1: 20
}
{
category1: "xxx",
category2: "lll",
category3: "mmm",
value1: 10
}

Map/Reduce函数:

function(doc)
emit([doc.category1, doc.category2, doc.category3], value1)
reduce: _sum

第 1 组总分 50.(20+20+10)

如果说 category3 === 'mmm'.

,我希望实现的是将 value1 转换为负数

第 1 组会给出答案 30 (20+20+(-10))

我试过以下地图功能:

function(doc)
if(doc.category3 === 'mmm'){
doc.value1 = doc.value1 * -1; //(or, doc.value1 = -doc.value1)
emit([doc.category1, doc.category2, doc.category3], value1)
reduce: _sum

结果:无输出。

我也试过:

function(doc)
var x = doc.value1;
if(doc.category3 === 'mmm'){
-Math.abs(x);
emit([doc.category1, doc.category2, doc.category3], x)
reduce: _sum

结果:错误:无效值。

和:

function(doc)
var x = doc.value1;
if(doc.category3 === 'mmm'){
-Math.abs(x);
emit([doc.category1, doc.category2, doc.category3], value1)
reduce: _sum

结果:完全错误的答案。

抱歉,我知道这是一个简单的问题,但我现阶段找不到答案。

请指点一下正确的方向。

首先要注意的是 doc 及其属性对于您的 map 和 reduce 函数是不可变的。您可以从 doc 中取出内容并将它们分配给临时变量并对其进行操作,但您不能更改 doc,这是您在第一个示例中尝试做的事情。

我不太清楚尝试 2 和 3 的问题是什么,因为看起来您没有包含所有 JS,但看起来您没有将更改后的值分配给临时变量.下面是为相关文档编写的函数:

var d1 = {
category1: "xxx",
category2: "lll",
category3: "mmm",
value1: 10
}

var emit = function(){
  var key = arguments[0];
  var value = arguments[1];
  console.log({"key": key, "value": value});
  } 



var _map = function(doc){
  var x = doc.value1;
  if (doc.category3 !== "mmm"){
    emit([doc.category1, doc.category2, doc.category3], x);
  }else{
    x = (-1 * Math.abs(x));
    emit([doc.category1, doc.category2, doc.category3], x);
  }
}

_map(d1)

地图函数应该做你想做的。