couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Robert Newson <robert.new...@gmail.com>
Subject Re: Join Query View
Date Thu, 11 Nov 2010 22:26:48 GMT
A reduce function must reduce the input to a smaller output. I once
campaigned to rename this function to
you_must_make_the_output_smaller_than_the_input but it was considered
too verbose.

I'm not sure I see why handling a json array with three items in it is
a difficulty. Your proposed map function correctly collates the data
you wish to retrieve, why not just fetch all the matching rows with
startkey/endkey? It's the same amount of data in the end.

B.

On Thu, Nov 11, 2010 at 10:16 PM, Duc Phan <th4ngnh0c@gmail.com> wrote:
> Hi again,
>  So let me understand this clearly. There is no way to combine the fields
> from multiple (2-3+) documents into one row in the output for couchDB?
> I will try to do more reading and research about the reduce and list
> functions over the weekend.
> Again, thank you for all your help.
>
> On Thu, Nov 11, 2010 at 3:07 PM, Chad George <chad@mgproducts.com> wrote:
>
>> Reduce functions are suppose to have significantly smaller outputs than
>> inputs.
>>
>> If you can't combine the results on the client then I think list functions
>> are what you need to use.
>>  On Nov 11, 2010 2:02 PM, "Duc Phan" <th4ngnh0c@gmail.com> wrote:
>> > Hi,
>> > Thanks for your response.
>> > I tried the js you sent and I got an error: reduce_overflow_error
>> >
>> > regards,
>> > Duc
>> >
>> > On Thu, Nov 11, 2010 at 1:49 PM, Diogo Silva <
>> manifesto@manifesto.blog.br
>> >wrote:
>> >
>> >> I guess if you just want to "merge" the docs of same key (serial) you
>> can
>> >> have a map like:
>> >>
>> >> function(doc){
>> >> emit(doc.SERIAL,doc);
>> >> }
>> >>
>> >> and reduce it with:
>> >>
>> >> function(key, values) {
>> >> var obj = {};
>> >> for(var i in values) {
>> >> for(var k in values[i]) {
>> >> obj[k] = values[i][k];
>> >> }
>> >> }
>> >> return obj;
>> >> }
>> >>
>> >>
>> >> 2010/11/11 Duc Phan <th4ngnh0c@gmail.com>
>> >>
>> >> > Hello Cliff,
>> >> >
>> >> > First, thank you for your response.
>> >> > I have seen that document (
>> >> > http://www.cmlenz.net/archives/2007/10/couchdb-joins ) and almost
>> every
>> >> > single thing that returned from Google with the query of "Join+ View+
>> >> Query
>> >> > +CouchDB".
>> >> > Please excuse my ignorant of these topics.
>> >> > I have tried the view collations, by using this code:
>> >> > function(doc){
>> >> > if (doc.Type == "Inventory"){
>> >> > emit ([doc.SERIAL,0],doc);}
>> >> > else if (doc.Type == "Machine"){
>> >> > emit([doc.SERIAL,1],doc);}
>> >> > }
>> >> >
>> >> >
>> >> > And when I run the view I get two rows for each machine (one contains
>> >> info
>> >> > in Inventory Doc and the other contains info in Machine Doc).
>> >> > Is that my solution? There isn't a way to get the info from Inventory
>> and
>> >> > Machine on one row?
>> >> >
>> >> > And.. yes I did migrate the data from an Oracle DB. I can construct
a
>> >> > document like :
>> >> >
>> >> >
>> >>
>>
>> {"ID":"someID","Name":"someName","Location":"someLocation","Serial":"someSerial","Model":"someModel","OS":"someOS","RAM":"someRAMsize","HD":"someHDsize"}
>> >> >
>> >> > but, I would like to know how to join them anyways because I will have
>> to
>> >> > do
>> >> > many more join queries because many of those fields are related to
>> other
>> >> > documents.
>> >> > I didn't think it was a good idea to put hundreds of fields into one
>> >> > document.
>> >> >
>> >> > Again, thank you for your suggestions. Any other suggestions or tips
>> >> would
>> >> > be greatly appreciated since I have spent two days trying to solve
my
>> >> > problems.
>> >> >
>> >> >
>> >> >
>> >> > On Thu, Nov 11, 2010 at 12:17 PM, Cliff Williams <cliffywills@aol.com
>> >> > >wrote:
>> >> >
>> >> > > Duc,
>> >> > >
>> >> > > have you seen this document
>> >> > >
>> >> > > http://www.cmlenz.net/archives/2007/10/couchdb-joins
>> >> > >
>> >> > > look for view collations
>> >> > >
>> >> > > Also
>> >> > >
>> >> > > What would be the harm in constructing a document with
>> >> > >
>> >> > >
>> >> > >
>> >> > >
>> >> >
>> >>
>>
>> {"ID":"someID","Name":"someName","Location":"someLocation","Serial":"someSerial","Model":"someModel","OS":"someOS","RAM":"someRAMsize","HD":"someHDsize"}
>> >> > >
>> >> > >
>> >> > > rather than the RDBMS format you describe (I assume that your
data
>> is
>> >> > > coming from a RDBMS).
>> >> > >
>> >> > > I think that it would make your life easier.
>> >> > >
>> >> > > best regards
>> >> > >
>> >> > > cliff
>> >> > >
>> >> > >
>> >> > >
>> >> > >
>> >> > > On 11/11/10 16:35, Duc Phan wrote:
>> >> > >
>> >> > >> Hello all,
>> >> > >> I am fairly new to couchDB and the Map/Reduce framework.
>> >> > >> I am having problems creating a join view.
>> >> > >>
>> >> > >> For example:
>> >> > >> I have multiple documents in these two formats
>> >> > >> First
>> >> > >> ------------------------------
>> >> > >> -------------
>> >> > >> Type : Inventory
>> >> > >> ID: someID
>> >> > >> Name: someName
>> >> > >> Location: someLocation
>> >> > >> Serial: someSerial
>> >> > >> ------------------------------------------
>> >> > >>
>> >> > >>
>> >> > >> Second
>> >> > >> -----------------------------------------
>> >> > >> Type: Machine
>> >> > >> Serial: someSerial
>> >> > >> Model: someModel
>> >> > >> OS: someOS
>> >> > >> RAM: someRAMsize
>> >> > >> HD: someHDsize
>> >> > >>
>> >> > >>
>> >> > >>
>> >> > >> Here is what I am trying to do...
>> >> > >> in SQL> Select ID, Name, Location, Type, Model, OS, RAM,
HD from
>> >> > >> Inventory,
>> >> > >> Machine where Inventory.Serial = Machine.Serial
>> >> > >> That would join the two tables where the Serials match up.
>> >> > >>
>> >> > >> How would I do that in couchDB where I have multiple documents
with
>> >> > Type:
>> >> > >> Inventory and Type: Machine
>> >> > >> I would like the output to be something like:
>> >> > >>
>> >> > >>
>> >> >
>> >>
>>
>> {"ID":"someID","Name":"someName","Location":"someLocation","Serial":"someSerial","Model":"someModel","OS":"someOS","RAM":"someRAMsize","HD":"someHDsize"}
>> >> > >> for all the machines
>> >> > >> I have read couchDB the definitive guide and many blogs but
I still
>> >> > >> haven't
>> >> > >> found a way to solve my problem.
>> >> > >>
>> >> > >> My attempt:
>> >> > >> Map: function(doc){
>> >> > >> if (doc.Type == "Inventory"){
>> >> > >> emit ([doc.SERIAL,0],doc);}
>> >> > >> else if (doc.Type == "Machine"){
>> >> > >> emit([doc.SERIAL,1],doc);}
>> >> > >> }
>> >> > >>
>> >> > >> Reduce: ? What should I do here.
>> >> > >>
>> >> > >> Thank you in advance for any suggestions or help.
>> >> > >>
>> >> > >>
>> >> >
>> >>
>>
>

Mime
View raw message