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 > > > > > > > > >
