The cmlenz post on CouchDB "Joins" is useful; are there other articles on CouchDB design patterns?
On Sep 28, 2010, at 11:18 AM, Paul Davis wrote: > On Tue, Sep 28, 2010 at 9:04 AM, Doug Reeder <[email protected]> wrote: >> Sorry, my earlier response seems to have gone astray. >> >> Thank you, but this map and reduce function produce exactly the same results >> as mine. >> >> Is there a general method of structuring data and map-reduce functions to do >> the same thing that a subselect does? >> > > No, there's nothing in general. SQL is a query language. Views are > range matches. The question is if you can rephrase your subselect to > give you the same data using collation. It may seem a bit limiting at > first, but there are a few different methods for arranging data. > > For instance, things like this: > http://www.cmlenz.net/archives/2007/10/couchdb-joins > Or this might be helpful: > http://blog.couchone.com/post/1167966323/a-gentle-introduction-to-couchdb-for-relational > > If you're still not able to get what you want, you might want to try > couchdb-lucene. > > HTH, > Paul Davis > >> >> On Sep 26, 2010, at 8:16 PM, Paul Davis wrote: >> >>> Hrm, I haven't thought this through to the end, but something that >>> might get you started: >>> >>> Change your emit to emit(key, 1); >>> >>> Change your reduce to: >>> >>> function(keys, vals) { >>> return sum(vals); >>> } >>> >>> Then query like such: >>> >>> ?key=query_key&limit=1 >>> ?group_level=length(query_key)&key=query_key >>> >>> It seems like there should be a fancy way to get the reduce call to >>> tell you if the original node had < 0 work but I'm distracted by other >>> code right now. >>> >>> HTH, >>> Paul Davis >>> >>> On Sun, Sep 26, 2010 at 7:46 PM, Doug Reeder <[email protected]> wrote: >>>> I've searched the wiki and googled for "subselect" and "subquery", and not >>>> found anything relevelant. >>>> >>>> I'm evaluating whether CouchDB can handle an app which currently stores a >>>> tree structure in a relational database using the "materialized path" >>>> represenation. For example, the item with path "QG" is a child of the >>>> item with path "Q" and a parent of the item with path "QGC". >>>> >>>> The trickiest query is, in English, "find all items with work less than >>>> zero and whether they have any children with work less than zero". The >>>> SQL for this is >>>> SELECT item.*, EXISTS (SELECT work FROM item AS d WHERE d.path > item.path >>>> AND d.path <= item.path || '\ufffd' AND d.work < 0) AS undonePrereq, FROM >>>> item WHERE work < 0 >>>> >>>> Can this be done in CouchDB, using a limited, small number of queries? >>>> >>>> My closest sally is the map function >>>> function(doc) { >>>> if (doc.work < 0) { >>>> var key = []; >>>> var i; >>>> for (i=0; i<doc._id.length; ++i) >>>> key.push(doc._id.charCodeAt(i)); >>>> emit(key, doc.work); >>>> } >>>> } >>>> >>>> and the reduce function >>>> function(keys, values, rereduce) { >>>> var shortestKeyLength = Infinity; >>>> for (var i=0; i<keys.length; ++i) { >>>> if (keys[i][0].length < shortestKeyLength) >>>> shortestKeyLength = keys[i][0].length; >>>> } >>>> >>>> return [keys.length, shortestKeyLength, >>>> keys[0][0].slice(0,shortestKeyLength), values.length]; >>>> } >>>> >>>> A query such as >>>> curl -X GET >>>> 'http://127.0.0.1:5984/tracker1/_design/trackerA/_view/undoneArrayNum?startkey=\[45,65,65\]&endkey=\[45,65,9999\]&group_level=2' >>>> will return the data necessary for items at the second level, but the >>>> desired items could be at any level. >> >> Doug Reeder >> [email protected] >> http://reeder29.livejournal.com/ >> https://twitter.com/reeder29 >> >> https://twitter.com/hominidsoftware >> http://outlinetracker.com >> >> >> >> >> >> >> >> >> Doug Reeder [email protected] http://reeder29.livejournal.com/ https://twitter.com/reeder29 https://twitter.com/hominidsoftware http://outlinetracker.com
