It is true that there is no dead-simple answer. There are several patterns however.
-
http://wiki.apache.org/couchdb/View_Snippets#Retrieve_the_top_N_tags. I do not personally like this because they acknowledge that it is a brittle solution, and the code is not relaxing-looking.
-
Avi’s answer, which is to sort in-memory in your application.
-
couchdb-lucene which it seems everybody finds themselves needing eventually!
-
What I like is what Chris said in Avi’s quote. Relax. In CouchDB, databases are lightweight and excel at giving you a unique perspective of your data. These days, the buzz is all about filtered replication which is all about slicing out subsets of your data to put in a separate DB.
Anyway, the basics are simple. You take your
.rows
from the view output and you insert it into a separate DB which simply emits keyed on the count. An additional trick is to write a very simple_list
function. Lists “render” the raw couch output into different formats. Your_list
function should output{ "docs": [ {..view row1...}, {..view row2...}, {..etc...} ] }
What that will do is format the view output exactly the way the
_bulk_docs
API requires it. Now you can pipe curl directly into another curl:curl host:5984/db/_design/myapp/_list/bulkdocs_formatter/query_popularity \ | curl -X POST host:5984/popularity_sorter/_design/myapp/_view/by_count
-
In fact, if your list function can handle all the docs, you may just have it sort them itself and return them to the client sorted.