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)
地图函数应该做你想做的。
我在 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)
地图函数应该做你想做的。