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

标签 javascript mapreduce couchdb

我在 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
}

映射/归约功能:

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

组级别 1 的总数为 50。(20+20+10)

我希望实现的是将 value1 转换为负数,如果类别3 === 'mmm'。

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

我尝试过以下 map 功能:

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 及其属性对于您的映射和归约函数是不可变的。您可以从 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)

map 功能应该可以满足您的需求。

关于javascript - CouchDB:有条件地将 Map/Reduce 输出中的值更改为负值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43020648/

相关文章:

couchdb - 如何查询 pouchdb 中已删除的文档?

node.js - 使用 nano 将二进制附件插入 CouchDB

javascript - 如何使用 jquery 和 ajax 淡入图像

javascript - 如何在javascript中合并2个对象?

javascript - 在 React Flux 上,我应该在哪里填充商店的初始状态?

macos - 完全重置 CouchDB

javascript - React + Flux 数据错误会产生 snackbar 通知?

lua - 在一个节点上运行的 lua 脚本能否从 Redis 集群中的另一个节点获取 key

hadoop - 如何在mapreduce中求平均值

node.js - lodash _.map 比 Node.js map 快吗?