I also asked this question in stackoverflow: http://stackoverflow.com/q/11207961/1448852
On Tue, Jun 26, 2012 at 7:52 PM, Mohammad Prabowo <[email protected]> wrote: > 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? > >
