You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@couchdb.apache.org by Ian Wootten <i....@gmail.com> on 2010/08/16 15:03:53 UTC

Struggling with a particular Map / Reduce

Hi Everyone,

I was hoping somebody might be able to solve a problem I'm having
attempting to implement a view at the moment.

Essentially, what it does is to take a collection of documents which
each have a single author and a list of names (which a possibly
repeated). There may be multiple documents by the same author, with
the same names within. Here's an example doc.

doc.author
doc.titles = ['sometitle', 'someothertitle', 'sometitle, 'anothertitle']

I would like to return a list of the top 3 titles across for each
author across all documents. I have tried and failed for several days
to get this working correctly.

So far, my map is as follows, giving the unique titles for a document,
not ordered at all:

function(doc) {

   var unique_titles = [];

   for(var i in doc.titles)
   {
      var count=0;

        for(var j in unique_titles)
        {
          if(doc.titles[i]==unique_titles[j])
          {
             count++;
          }
        }

        if(count==0)
        {
          unique_titles.push(doc.titles[i]);
        }
   }

   for(var k=0; k<unique_titles.length;k++)
   {
     emit(doc.author, unique_titles[k]);
   }
}

My map is as follows, this returns two unique titles from a single
document when only a single document exists for an author(I think):

function(keys, values, rereduce) {
  return values.splice(0,2);
}

My problem is that:

a) I can't return more than 2 items from the values array (if I set
the splice length to 3, futon spits back a non-reducing error at me).
b) Where multiple documents exist for the same author, in some
instances I see a weird multi-dimensional array returned (rather than
just two values). For example:
[['sometitle','someothertitle'],['anothertitle'],['afurthertitle']]

Presumably b) is the result of multiple documents for a single author
interfering with one another, though I'm confused as to how I
configure my map/reduce in order to get the information I'm after (I
also wonder if its even possible).

I've attempted to understand the documentation on reduce functions,
taking a look at the many examples that exist too, but I'm unable to
understand them well enough to solve my problem.

I'd appreciate any help on this!

Thanks,

Ian