On Tue, Jun 21, 2011 at 11:28 AM, Clement Hallet <[email protected]> wrote: > Glad to hear it helped. > I can't tell why it's still sorted, but to be sure it remains like that i > would do : > > View > > function(doc) { > if (doc.type && doc.name) { > var lowerCased = doc.name.toLowerCase(); > var firstLetter = lowerCased.toLowerCase()[0]; > emit([doc.type, firstLetter, lowerCased], doc.name); > } > } > > Rewrite > > { > "from": "artists/:key", > "to": "_list/artists/type_name", > "query": { > "startkey": ["artist", ":key"], > "endkey": ["artist", ":key", {}] > } > } > > So the 3rd element of the key is not used as a filter but more as a sorting > field.
I realized the data set I was testing with happened to follow the same ordering for both doc IDs and the "name" field. When I added new documents with IDs that didn't match the alphabetical ordering of the "name" fields, the sorting was incorrect. Your suggestion to add a third element to the key, however, fixed that as well. I think I'm slowly learning how to carefully craft my views. One gotcha is that in switching to "startkey" and "endkey" I couldn't use ":key" as the rewrite variable since it would also get added to the query as "key". I switched to ":startkey" and now things are fine. Thanks again! > -- > Clément > > > Le 21 juin 2011 à 17:17, Gabriel Farrell a écrit : > >> On Tue, Jun 21, 2011 at 10:29 AM, Clement Hallet <[email protected]> wrote: >>> Hello Gabriel, >>> >>> Why not making a key using only the first letter ? >>> >>> function(doc) { >>> if (doc.type && doc.name) { >>> emit([doc.type, doc.name[0]); >>> } >>> } >>> >>> >>> and querying it with that key = ["artist","a"] >> >> Interesting idea. If I only use the first letter (and lowercase it as >> well to catch names starting with "A"), then I can get the URLs I >> want. I thought I would lose the sorting within each letter, but >> they're still sorted! I don't understand why that is, but it's a nice >> surprise. >> >> My view now looks like this: >> >> function(doc) { >> if (doc.type && doc.name) { >> var firstLetter = doc.name.toLowerCase()[0]; >> emit([doc.type, firstLetter], doc.name); >> } >> } >> >> And the rewrite is simplified to this: >> >> { >> "from": "artists/:key", >> "to": "_list/artists/type_name", >> "query": { >> "key": ["artist", ":key"] >> } >> }, >> >> Thanks! >> >>> -- >>> Clément >>> >>> Le 21 juin 2011 à 16:18, Gabriel Farrell a écrit : >>> >>>> I'm putting together a site where I have artists and works of art. I >>>> would like to browse those artists and works alphabetically, with URLs >>>> like http://example.com/artists/a and http://example.com/works/b. I >>>> have a view called type_name: >>>> >>>> function(doc) { >>>> if (doc.type && doc.name) { >>>> emit([doc.type, doc.name]); >>>> } >>>> } >>>> >>>> My "artists" list renders the results from that view in a template. I >>>> can get the first page of artists with a rewrite like this: >>>> >>>> { >>>> "from": "artists/a", >>>> "to": "_list/artists/type_name", >>>> "query": { >>>> "startkey": ["artist", "a"], >>>> "endkey": ["artist", "aZZZZZ"] >>>> } >>>> }, >>>> >>>> How would I generalize this for all letters of the alphabet? I want to >>>> do something like the following, but the last ":startkey" isn't >>>> substituted: >>>> >>>> { >>>> "from": "artists/:startkey", >>>> "to": "_list/artists/type_name", >>>> "query": { >>>> "startkey": ["artist", ":startkey"], >>>> "endkey": ["artist", ":startkeyZZZZZ"] >>>> } >>>> }, >>>> >>>> I can achieve something close by extending the URL to >>>> http://example.com/artists/a/aZZZZZ and using the following rewrite: >>>> >>>> { >>>> "from": "artists/:startkey/:endkey", >>>> "to": "_list/artists/type_name", >>>> "query": { >>>> "startkey": ["artist", ":startkey"], >>>> "endkey": ["artist", ":endkey"] >>>> } >>>> }, >>>> >>>> The URL is uglier but it works. Is there any way to make the shorter >>>> URL work? Frankly, I think some of my trouble is that, coming from >>>> other web frameworks, I'm not used to my URLs being constrained in >>>> this way. I want to be able to grab the request path, munge it all >>>> over with JavaScript, then send it on to my lists, shows, views, etc. >>> >>> > >
