incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Doug Reeder <reeder...@gmail.com>
Subject Re: Subselect Possible?
Date Tue, 28 Sep 2010 16:36:22 GMT
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 <reeder.29@gmail.com> 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 <reeder.29@gmail.com> 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
>> reeder.29@gmail.com
>> http://reeder29.livejournal.com/
>> https://twitter.com/reeder29
>> 
>> https://twitter.com/hominidsoftware
>> http://outlinetracker.com
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 

Doug Reeder
reeder.29@gmail.com
http://reeder29.livejournal.com/
https://twitter.com/reeder29

https://twitter.com/hominidsoftware
http://outlinetracker.com









Mime
View raw message