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