couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mohammad Prabowo <riz...@gmail.com>
Subject How to merge objects attributes from reduce to rereduce function.
Date Tue, 26 Jun 2012 12:52:44 GMT
This is my JSON schema:

{
"emp_no": ..,
"salary": ..,
"from_date": ..,
"to_date": ..,
"type" : "salaries"
}

{
"emp_no": ..,
"title": ..,
"from_date": ..,
"to_date" : ..,
"type" : "titles"
}

What i wanted to do, is to find the average salary for each active title.
Active titles are document with "from_date" attribute set to "9999-01-01"

Here is my Map Function

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]);
}
}
}

Here is the resulting key value pairs emited:

http://i.imgur.com/o1Qxz.png

Now, i want to reduce it into single key-value pair, with the value
outputted is set into javascript object like this

{
"engineer" : 64342,
"senior engineer" : 123111,
"staff" : ...,
"senior staf" : ...,
.
.
.
}

Here's how i planned to do it: First, in reduce step, i'm gonna return
object that merge properties from the same emp_no. Then, in reduce step,
i'm gonna create a new object  that has properties name based on reduced
value before.

It's hard to explain, so here is my reduce function:

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;
}

The resulting value here is reduced value, which is what i expected:
http://i.imgur.com/SnlOU.png

But, when i set the grouping value to 'none' in futon, it's not what i
wanted:
http://i.imgur.com/nfDn6.png

Could someone help me to solves this?

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message