到rereduce功能這是我的JSON模式:如何合併對象從降低屬性CouchDB中
{"emp_no": ..,
"salary": ..,
"from_date": ..,
"to_date": ..,
"type" : "salaries"}
{"emp_no": ..,
"title": ..,
"from_date": ..,
"to_date" : ..,
"type" : "titles"}
什麼,我想要做的,就是找到每個活動標題的平均工資。活動標題是用 「FROM_DATE」 屬性設置文件爲 「9999-01-01」
這裏是我的地圖功能
function(doc) {
if (doc.type == 'salaries') {
var dateSalaries = null;
dateSalaries = doc.to_date.split("-");
if(dateSalaries[0].localeCompare("9999") == 0){
emit(doc.emp_no, ["salary", doc.salary]);
}
} else if (doc.type == 'titles') {
var dateTitles = null;
dateTitles = doc.to_date.split("-");
if(dateTitles[0].localeCompare("9999") == 0){
emit(doc.emp_no, ["title", doc.title]);
}
}
}
這裏是產生鍵值對emited:
現在,我想將它縮減爲單個鍵值對,並將輸出的值設置爲這樣的javascript對象
{
"engineer" : 64342,
"senior engineer" : 123111,
"staff" : ...,
"senior staf" : ...,
.
.
.
}
下面是我計劃如何實現它:首先,在減少步驟中,我將返回合併來自同一個emp_no的屬性的對象。然後,在減少步驟中,我將創建一個新的對象,該對象具有基於之前減少的值的屬性名稱。
這很難解釋,所以這裏我減少功能:
function(keys, values, rereduce) {
var i, l, attr, sal, rv = {};
if (rereduce) {
for (i = 0, l = values.length; i<l ; ++i) {
if (values[i].hasOwnProperty('salary')) {
attr = values[i].title;
sal = values[i].salary;
if (rv[attr] instanceof Array) {
rv[attr].push(sal);
} else{
rv[attr] = [];
rv[attr].push(sal);
}
}
}
for (var x in rv) {
if (rv.hasOwnProperty(x)) {
var totalSalary = 0;
for (i = 0, l = values.length; i<l ; i++) {
totalSalary += rv[x][i];
}
rv[x] = totalSalary/rv[x].length;
}
}
} else {
for (i = 0, l = values.length; i<l ; i++) {
switch (values[i][0]) {
case "title" : rv["title"] = values[i][1]; break;
case "salary": rv["salary"] = values[i][1]; break;
}
}
}
return rv;
}
這裏所得到的值降低的價值,這是我所期待的: http://i.imgur.com/SnlOU.png
但是,當我設置分組價值'在'蒲團,這不是我想要的:
{Senior Engineer: null, Assistant Engineer: null, Technique Leader: null}
有人可以幫我解決這個問題嗎?
我已經改變了rereduce步驟,但仍然困擾着找到平均工資。這裏的後續問題:(http://stackoverflow.com/q/11231108/1448852) –