incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mohammad Prabowo <riz...@gmail.com>
Subject Re: How to merge objects attributes from reduce to rereduce function.
Date Tue, 26 Jun 2012 13:12:17 GMT
I also asked this question in stackoverflow:
http://stackoverflow.com/q/11207961/1448852

On Tue, Jun 26, 2012 at 7:52 PM, Mohammad Prabowo <rizalp@gmail.com> 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?
>
>

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