<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mariano Guerra's Log (Publicaciones sobre views)</title><link>http://marianoguerra.org/</link><description></description><atom:link href="http://marianoguerra.org/es/categories/views.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><lastBuildDate>Mon, 18 Nov 2024 17:56:19 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>CouchApp V: filtrar documentos por tag ordenados por fecha</title><link>http://marianoguerra.org/es/posts/201011couchapp-v-filtrar-documentos-por-tag/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;p&gt;ahora tenemos documentos y para pertenecer a este siglo decidiste agregar tags a algunos elementos para poder filtrarlos y categorizarlos (decí folksonomia y vas a sonar mucho mas hip!)&lt;br&gt;&lt;br&gt;ahora, como filtro documentos por tag?&lt;br&gt;&lt;br&gt;si puedo hacer eso, como filtro por tag y ordeno por fecha?&lt;br&gt;&lt;br&gt;ya que estamos, no seria lindo poder filtrar por tag *y* por fecha?&lt;br&gt;&lt;br&gt;vamos a resolver todos estos requerimientos con una simple vista&lt;br&gt;&lt;br&gt;primero creamos la vista&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;pre&gt;couchapp generate view by-tag&lt;br&gt;&lt;/pre&gt;&lt;br&gt;esto crea una vista en el directorio views llamado by-tag, este es un directorio que contiene dos archivos, map.js y reduce.js&lt;br&gt;&lt;br&gt;en este caso vamos a usar solo map.js asi que borra reduce.js&lt;br&gt;&lt;br&gt;&lt;pre&gt;cd views/by-tag&lt;br&gt;rm reduce.js&lt;br&gt;&lt;/pre&gt;&lt;br&gt;ahora edita map.js para que se vea como esto&lt;br&gt;&lt;br&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;created&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;por cada documento en la base de datos, vemos si tiene el atributo tags, si lo tiene, por cada tag en tags emitimos un documento cuya llave es un array con el tag y la fecha y cuyo valor es el documento en si.&lt;br&gt;&lt;br&gt;ahora empujamos los cambios a couchdb&lt;br&gt;&lt;br&gt;&lt;pre&gt;couchapp push&lt;br&gt;&lt;/pre&gt;&lt;br&gt;para probar que funciona, crea algunos documentos con el un campo llamado tags que contenga un array de strings y otro campo llamado created que contenga el timestamp en el que el documento fue creado&lt;br&gt;&lt;br&gt;si pongo esta URL http://localhost:5984/datos/_design/datos/_view/by-tag/ en mi navegador, obtengo algo así:&lt;br&gt;&lt;br&gt;&lt;pre&gt;{"total_rows":8,"offset":0,"rows":[&lt;br&gt;{"id":"d6de7e9a63039dc1af500a40af0014d7","key":["bar",1288644825761],"value":{"_id":"d6de7e9a63039dc1af500a40af0014d7","_rev":"1-eab86fbc2b4c24f31e1d60dfdd762793","author":"wariano", "created":1288644825761, "tags":["test","foo","bar"], ...}},&lt;br&gt;...&lt;br&gt;]}&lt;br&gt;&lt;/pre&gt;&lt;br&gt;esto significa que la vista funciono, ahora para filtrar por tag la URL se va a poner un poco rara&lt;br&gt;&lt;br&gt;vamos a usar filtros en la vista para filtrar solo los documentos con un tag especifico&lt;br&gt;&lt;br&gt;http://localhost:5984/datos/_design/datos/_view/by-tag?descending=false&amp;amp;startkey=["test", 0]&amp;amp;endkey=["test", 9999999999999]&lt;br&gt;&lt;br&gt;con este request decimos que queremos los resultados de la vista llamada by-tag, filtrando los documentos empezando con la llave ["test", 0] y terminando con la llave ["test", 9999999999999]. Esto significa que solo queremos los documentos con la llave "test" y que queremos todos los timestamps (por eso el numero enorme en endkey)&lt;br&gt;&lt;br&gt;si queremos ordenar los tags en orden descendente deberíamos cambiar el orden de starkey y endkey: http://localhost:5984/datos/_design/datos/_view/by-tag?descending=true&amp;amp;startkey=["test", 9999999999999]&amp;amp;endkey=["test", 0]&lt;br&gt;&lt;br&gt;podemos jugar con startkey y endkey para obtener rangos de tags o un tag en un periodo de tiempo especifico, por ejemplo: "cosas taggeadas con fun en los últimos dos días"&lt;br&gt;&lt;br&gt;el código para hacer el request a couchdb desde javascript es el siguiente&lt;br&gt;&lt;br&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;datos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getByTag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;descending&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;okCb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;errorCb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;startStamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endStamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="nx"&gt;startStamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startStamp&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;endStamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;endStamp&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;9999999999999&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;descending&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;endStamp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;endStamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startStamp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;startStamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;couch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;datos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"datos/by-tag"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"descending"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;descending&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"startkey"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;startStamp&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;"endkey"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endStamp&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;br&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;okCb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;errorCb&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;con esto tenes una forma de listar documentos por uno o mas campos, podes modificar este ejemplo un poco para listar por usuario o por otras cosas</description><guid>http://marianoguerra.org/es/posts/201011couchapp-v-filtrar-documentos-por-tag/</guid><pubDate>Tue, 02 Nov 2010 14:34:00 GMT</pubDate></item><item><title>[EN] CouchApp V: filter documents by tag ordered by timestamp</title><link>http://marianoguerra.org/es/posts/201011en-couchapp-v-filter-documents-by-tag/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;p&gt;you now have documents and to be in this century you decide to add tags to some elements so you can filter and categorize (say folksonomy and you will sound really hip!)&lt;/p&gt;&lt;br&gt;&lt;p&gt;now, how do I filter the documents by tag?&lt;/p&gt;&lt;br&gt;&lt;p&gt;if I can do that, how do I filter by tag and order by date?&lt;/p&gt;&lt;br&gt;&lt;p&gt;now that we are at it, wouldn't be nice to have a filter by tag *and* date?&lt;/p&gt;&lt;br&gt;&lt;p&gt;we will solve all this requirements with a simple view&lt;/p&gt;&lt;br&gt;&lt;p&gt;first we create the view&lt;/p&gt;&lt;br&gt;&lt;pre&gt;couchapp generate view by-tag&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;p&gt;this creates a view in the views called by-tags, this is a directory that contains two files, map.js and reduce.js&lt;/p&gt;&lt;br&gt;&lt;p&gt;in this case we will only use the map.js file, so remove the reduce.js file&lt;/p&gt;&lt;br&gt;&lt;pre&gt;cd views/by-tag&lt;br&gt;rm reduce.js&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;p&gt;now edit the map.js file to look like this&lt;/p&gt;&lt;br&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;created&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;p&gt;here for each document in the database we check if the document has the tags attribute and if it has the attribute, for each tag we emit a document that contains as key an array with the tag and timestamp when the document was created and as value the document itself&lt;/p&gt;&lt;br&gt;&lt;p&gt;now we push our changes to couchdb&lt;/p&gt;&lt;br&gt;&lt;pre&gt;couchapp push&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;p&gt;to test that this works, create some documents with a field called tags that contains a list of strings and a field called created that contain the timestamp when the item was created&lt;/p&gt;&lt;br&gt;&lt;p&gt;if I put this URL http://localhost:5984/datos/_design/datos/_view/by-tag/ in my browser I get something like this&lt;/p&gt;&lt;br&gt;&lt;pre&gt;{"total_rows":8,"offset":0,"rows":[&lt;br&gt;{"id":"d6de7e9a63039dc1af500a40af0014d7","key":["bar",1288644825761],"value":{"_id":"d6de7e9a63039dc1af500a40af0014d7","_rev":"1-eab86fbc2b4c24f31e1d60dfdd762793","author":"wariano", "created":1288644825761, "tags":["test","foo","bar"], ...}},&lt;br&gt;...&lt;br&gt;]}&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;p&gt;this means the view worked, now to filter by tag the URL will get weird&lt;/p&gt;&lt;br&gt;&lt;p&gt;we will use filters in the view to filter only for a specific tag&lt;/p&gt;&lt;br&gt;&lt;p&gt;http://localhost:5984/datos/_design/datos/_view/by-tag?descending=false&amp;amp;startkey=["test", 0]&amp;amp;endkey=["test", 9999999999999]&lt;/p&gt;&lt;br&gt;&lt;p&gt;with this request we say that we want to get the result of the view called by-tag, filtering starting with the key ["test", 0] and ending with the key ["test", 9999999999999]. This means that we only want the documents with the key "test" and we want all the timestamps (that's why the huge number in the endkey&lt;/p&gt;&lt;br&gt;&lt;p&gt;if we want to sort the tags in descending order we should switch the start and endkey like this: http://localhost:5984/datos/_design/datos/_view/by-tag?descending=true&amp;amp;startkey=["test", 9999999999999]&amp;amp;endkey=["test", 0]&lt;/p&gt;&lt;br&gt;&lt;p&gt;we can play with startkey and endkey to get a range of tags or one tag in a specific period, for example, "things tagged fun in the last 2 days"&lt;/p&gt;&lt;br&gt;&lt;p&gt;the code to do the request to couchdb from javascript is the following&lt;/p&gt;&lt;br&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nx"&gt;datos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getByTag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;descending&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;okCb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;errorCb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;startStamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endStamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="nx"&gt;startStamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startStamp&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;endStamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;endStamp&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;9999999999999&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;descending&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;endStamp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;endStamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startStamp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class="nx"&gt;startStamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;couch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;datos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"datos/by-tag"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"descending"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;descending&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"startkey"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;startStamp&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;"endkey"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endStamp&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;br&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;okCb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;errorCb&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;br&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;with this you have a way to list documents by one or more fields, you can modify this a little to list by users, or by some other thing</description><guid>http://marianoguerra.org/es/posts/201011en-couchapp-v-filter-documents-by-tag/</guid><pubDate>Tue, 02 Nov 2010 14:10:00 GMT</pubDate></item></channel></rss>