Map/Reduce on an array of hashes in CouchDB

Posted by sebastiangeiger on Stack Overflow See other posts from Stack Overflow or by sebastiangeiger
Published on 2010-03-16T12:29:37Z Indexed on 2010/03/16 13:56 UTC
Read the original article Hit count: 561

Filed under:
|
|

Hello everyone,

I am looking for a map/reduce function to calculate the status in a Design Document. Below you can see an example document from my current database.

{
   "_id": "0238f1414f2f95a47266ca43709a6591",
   "_rev": "22-24a741981b4de71f33cc70c7e5744442",
   "status": "retrieved image urls",
   "term": "Lucas Winter",
   "urls": [
       {
           "status": "retrieved",
            "url": "http://...."
       },
       {
           "status": "retrieved",
            "url": "http://..."
       }
   ],
   "search_depth": 1,
   "possible_labels": {
       "gender": "male"
    },
    "couchrest-type": "SearchTerm"
}

I'd like to get rid of the status key and rather calculate it from the statuses of the urls. My current by_status view looks like the following:

function(doc) {
    if (doc['status']) {
       emit(doc['status'], null);
    }
}

I tried some things but nothing actually works. Right now my Map Function looks like this:

function(doc) {
    if(doc.urls){
        emit(doc._id, doc.urls)
    }
}

And my Reduce Function

function(key, value, rereduce){ 
    var reduced_status = "retrieved"
    for(var url in value){
        if(url.status=="new"){
            reduced_status = "new";
        }
    }
    return reduced_status;
}

The result is that I get retrieved everywhere which is definitely not right.

I tried to narrow down the problem and it seems to be that value is no array, when I use the following Reduce Function I get length 1 everywhere, which is impossible because I have 12 documents in my database, each containing between 20 to 200 urls

function(key, value, rereduce){ 
   return value.length;
}

alt text

What am I doing wrong? (I know I want you to write code for me and I'm feeling guilty, but right now I do the calculation of the statuses in ruby after getting the data from the database. It would be nice to already get the right data from the database)

© Stack Overflow or respective owner

Related posts about couchdb

Related posts about mapreduce