2017-03-25 56 views
0

我在CouchDB 1.6.1的類別中有數字數據。CouchDB:有條件地將Map/Reduce輸出中的值更改爲負

的文件將是這個樣子:

{ 
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)

我希望實現的是將value1轉換爲負數,如果說category3 ==='mmm'。然後

組級別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 

結果:完全不正確的答案。

對不起,我知道這是一個簡單的問題,但我現階段無法找到答案。

請問我可否指點正確的方向?

回答

1

首先要注意的是,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函數應該做你想要什麼。

+0

工作得很好。 「x =(-1 * Math.abs(x));」是我沒有正確的。再次,非常感謝。 – jlb333333