incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From laccolithgr...@gmx.de
Subject Re: Finding pairs of documents
Date Fri, 29 May 2009 10:58:43 GMT
On Thu, May 28, 2009 at 9:26 PM, Boris Schmidt <laccolithgrunt@gmx.de> wrote:
> Hi!
>
> I'm quite new to CouchDB and map/reduce and played a little around with it. Currently,
I am trying to find pairs of two documents which fulfill a special condition. E.g., consider
the following documents in the store (_id and _rev are left out): [{price: 1},{price: 5},{price:
9},{price: 1000}]
>
> Now I would like to find all pair of documents, where (doc1.price + 4 == doc2.price).
How can I express this in couchdb? I expect the following result: [[{price: 1},{price: 5}],
[{price: 5},{price:9}]]
>
> My first try was:
> map: function(doc){
>  emit(null, doc);
> }
> reduce: function(key, values){
>  for(var i in values){
>    for(var j in values){
>      if(values[i].price + 4 == values[j]) return [values[i], values[j]];
>    }
>  }
> }
>
> But then I recognized the rereduce property in CouchDB and that the values of the reduce
funtion can be only intermediate results. So how can I express what I want to do in map reduce?
>
> Thx!
> Boris
> --
> Nur bis 31.05.: GMX FreeDSL Komplettanschluss mit DSL 6.000 Flatrate und
> Telefonanschluss nur 17,95 Euro/mtl.!* http://portal.gmx.net/de/go/dsl02
>

I just recognized that my reduce funtion cannot work as expected, I
have to collect the combinations and return them afterwards:
map: function(doc){
  emit(null, doc);
}
reduce: function(key, values){
  var combs = [];
  for(var i in values){
    for(var j in values){
      if(values[i].price + 4 == values[j]) combs.push([values[i], values[j]]);
    }
  }
  return combs;
}
This works for cases where no rereduce takes place, but in other cases
it still have problems. How do I have to design my map/reduce
functions so that they cover my use case?

Thx!
Boris

Mime
View raw message