couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Wout Mertens <wout.mert...@gmail.com>
Subject Re: group_level and sorting
Date Sun, 19 Apr 2009 10:02:23 GMT
It's not quite clear exactly what you want. I see that you are making  
your value list unique, so I'm assuming that you want some sort of  
unique or last function?


I notice a mistake in your code: when creating a reduce function, a re- 
reduce should behave in the same way as the regular reduce. The reason  
is that CouchDB doesn't necessarily call re-reduce on your map results.

Think about it this way: If you have a bunch of values V1 V2 V3 for  
key K, then you can get the combined result either by calling  
reduce([K,K,K],[V1,V2,V3],0) or by re-reducing the individual results:  
reduce(null,[R1,R2,R3],1). This depends on what your view results look  
like internally.


That said, what are you interested in? Do you want the last-changed  
title or do you want all titles in order of appearance?

If the latter, you don't need a reduce at all, you just look at the  
results of your map function in order.

If the former, you'll have to put your date in the value of the map,  
and in the reduce you'll have to decide which title you want to keep  
for that set of values.

Wout.

PS: I changed the wiki so that it has a common mistakes section in the  
ViewSnippets page and I added the reduce mistake.

On Apr 18, 2009, at 6:52 PM, Nicolas Clairon wrote:

> Hi all !
>
> I have a question (wich is a big concerne to me and my project) about
> the group_level option.
>
> I want to display all doc by tag and then sorting them by date.
>
> The map function :
> -----------------------------------
> function(doc){
>  for(var t in doc.tags){
>    emit([doc.tags[t], doc.creation_date], doc.title);
>  }
> }
> ------------------------------------
>
> * creation_date is a float since the epoch (ie something like this  
> 12423344.003)
> * docs can have the same title
>
> the reduce function:
> -----------------------------------
> function(key, values, rereduce){
>    var results = [];
>    if(!rereduce){
>        for( var v in values){
>            if (results.indexOf( values[v] ) < 0) 
> {results.push(values[v]);}
>        }
>    }
>    else{
>        for( var i in values){
>            for(var e in values[i]){
>                results.push(values[i][e]);
>            }
>        }
>    }
>    return results;
> }
> -----------------------------------
>
> $ curl http://localhost:5984/db/_design/foo/_view/by_tag_sort_by_date?reduce=false
>
> returns :
>
> {"id":"8075ba2ef7418f4d6c9a3e89be83acd8","key":["tag1", 
> 1239361935.000004],"value":"title2"},
> {"id":"8d9132318a6c34c646e9e2cd43823ffa","key":["tag1", 
> 1239794744.000002],"value":"title1"},
> {"id":"f49a28ffd2118298c1be7440ec4556fa","key":["tag2", 
> 1239794744.000002],"value":"title1"},
>
> this is ok because title1 is newer than title2. But now, I want all
> displayed by tag so I use the group_level :
>
> $ curl http://localhost:5984/db/_design/foo/_view/by_tag_sort_by_date?group_level=1
>
> {"key":["tag1"],"value":["title1","title2"]},
> {"key":["tag2"],"value":["title1"]},
>
> I have all titles by tag but the docs is not sorted by date anymore...
>
> Does group_level keeps the absolute sorting ? Does the sort break  
> anyway ?
>
> Thanks,
>
> Nicolas


Mime
View raw message