Return-Path: Delivered-To: apmail-couchdb-user-archive@www.apache.org Received: (qmail 753 invoked from network); 20 Nov 2009 17:16:59 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 20 Nov 2009 17:16:59 -0000 Received: (qmail 42374 invoked by uid 500); 20 Nov 2009 17:16:58 -0000 Delivered-To: apmail-couchdb-user-archive@couchdb.apache.org Received: (qmail 42293 invoked by uid 500); 20 Nov 2009 17:16:57 -0000 Mailing-List: contact user-help@couchdb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@couchdb.apache.org Delivered-To: mailing list user@couchdb.apache.org Received: (qmail 42283 invoked by uid 99); 20 Nov 2009 17:16:57 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 20 Nov 2009 17:16:57 +0000 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of sebastien.pastor@gmx.com designates 213.165.64.42 as permitted sender) Received: from [213.165.64.42] (HELO mailout-eu.gmx.com) (213.165.64.42) by apache.org (qpsmtpd/0.29) with SMTP; Fri, 20 Nov 2009 17:16:48 +0000 Received: (qmail invoked by alias); 20 Nov 2009 17:16:27 -0000 Received: from nor75-28-88-183-28-27.fbx.proxad.net (EHLO seblaptop) [88.183.28.27] by mail.gmx.com (mp-eu003) with SMTP; 20 Nov 2009 18:16:27 +0100 X-Authenticated: #57395542 X-Provags-ID: V01U2FsdGVkX1+IWzMbBgiIOzEDDoNY/ati20paN2iR+96phgDk1m 307LBpO0JdBwY3 Date: Fri, 20 Nov 2009 19:12:24 +0100 From: Sebastien PASTOR To: user@couchdb.apache.org Subject: Re: Newbie :Filtering using complex key and array Message-ID: <20091120181224.GC6038@seblaptop> References: <20091120112631.49640@gmx.com> <20091120124342.GA6038@seblaptop> <214c385b0911200415p18f6fa92yf69026ecfb7bec89@mail.gmail.com> <20091120152718.GB6038@seblaptop> <214c385b0911200740w63cff392r533ec5fffb557f36@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <214c385b0911200740w63cff392r533ec5fffb557f36@mail.gmail.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Y-GMX-Trusted: 0 X-FuHaFi: 0.48 X-Virus-Checked: Checked by ClamAV on apache.org Thanks again Matt, To be honnest i didn't know the group_level parameter.neat ! I understand i would need another view if i wanted to know the count of restaurant per type only. But i want both : filter by restaurant type and postal code. In that regards the solution you gave me works great. So i think my question was really this : can the reduce function produce the same result without printing out the postal code since i don t really need it cause all i am interested in is type of restaurant and number of them in the area specified in the Query. I guess at the reduce level this cannot be done but maybe somewhere else? As a matter of fact i can live without this : all i need to do is pick up key[1] in my JQuery parser to get what i want, but stilli, would be nice to know whether is is possible to be able to spill out the json data you want out of a view. Hope i ve been clearer (and that is nottoo much of a dumb question ) and thanx again for your time. Cheers Seb On Fri, Nov 20, 2009 at 03:40:08PM +0000, Matt Goodall wrote: > 2009/11/20 Sebastien PASTOR : > > Thanks for the quick reply Matt, > > > > It does sound like a trick because it might generate a much bigger list > > than i ll have document in the db (times number of delivery areas). But > > i guess as long as the map index ??is generated only once it will just be > > a matter of more space used to store the index right? > > Correct. CouchDB's views essentially trade disk space for predictable > query times (assuming the view is up to date, of course). > > One thing you can do to reduce the size of views, if necessary, is to > emit a null value, i.e. emit(key, null), and add the include_docs=true > query parameter when GET'ing the view. See > http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options. > > However, that may make things a little slower and put a bit more load > on CouchDB. If everything's in the view then CouchDB can jump into > the view at the startkey and simply stream the view until the endkey. > With include_docs=true there's another lookup to get the doc per row > returned by the view. > > I've never measured the performance hit of include_docs, I just know I > use it quite a lot and haven't worried too much about it so far ;-). > > > I guess this is how things should be > > handled when using couchDB, not obvious when coming from SQL :) > > Yep, it's quite a different way of thinking about your data. > > > At least it works exactly as expected.One little thing that bugs me is that the reduce function returns : > > > > {"rows":[ > > {"key":[75010,"indian"],"value":1}, > > {"key":[75010,"italian"],"value":2}, > > {"key":[75010,"japanese"],"value":1} > > ]} > > As you've probably discovered, you can get three types of count from > this view by playing with the view's group_level query param: > > 1. The number of restaurants of each type in a delivery area, e.g. > italian restaurants in 75010. > 2. The number of restaurants in a delivery area. > 3. The total number of restaurants in your database. > > > > > If i want to return only restaurant type and the number of > > restaurants > > Something like : > > {"key":"italian","value":1}, > > > > Is it something to could/should be done in Lists or in some way in the > > reduce function ? > > For this you'll need an additional view. The map would probably > emit(doc.type, 1) and the reduce would calculate the sum. > > - Matt > > > > > Thanks again ! > > > > Sebastien > > > > On Fri, Nov 20, 2009 at 12:15:59PM +0000, Matt Goodall wrote: > >> 2009/11/20 Sebastien PASTOR : > >> > Sorry for the previous blank mail ... here is the content : > >> > > >> > Hi there, > >> > > >> > Pretty new to couchDB. I ve read a lot about couchdb and finally dive > >> > into it with a small project :) > >> > I am trying to do a simple thing and i am not sure at all if i am going > >> > the right way : > >> > > >> > my docs look like this : > >> > > >> > { > >> > ??"name":"Pizza Torino", > >> > ?? "delivery_areas":[75019,75018,75012,75013,75010], > >> > ?? ?? "type":"italian" > >> > ?? ?? } > >> > > >> > ?? ?? I managed to get ??all shops by type and get a reduce function to > >> > ?? ?? do the sum ( not much i know but still quite an accomplishment for > >> > ?? ?? me :) ) > >> > ?? ?? I then tried to get my result filtered by delivery_areas. as in > >> > ?? ?? getting only shop > >> > ?? ?? that do delivery in postal code 75019. I just could not ??have > >> > ?? ?? anything that > >> > ?? ?? worked using startkey and endkey ... is it the way to go or is > >> > ?? ?? storing > >> > ?? ?? delivery_areas within an array not right ? > >> > > >> > ?? ?? my last map function looks like this : > >> > ?? ?? ?? ?? "getShops" : { > >> > ?? ?? ?? ?? ?? ?? ?? ?? ??"map" : "function(doc){ > >> > ?? ?? ?? ?? ?? ?? ?? ?? emit([doc.delivery_areas,doc.type],doc.name) > >> > ?? ?? ?? ?? ?? ?? ?? ?? } > >> > ?? ?? } > >> > > >> > ??Thanks for pointing me to the right direction > >> > >> Storing a list of delivery areas is good. The "trick" is to emit > >> multiple rows per document, e.g. > >> > >> ?? ?? function(doc) { > >> ?? ?? ?? for each (area in doc.delivery_areas) { > >> ?? ?? ?? ?? emit([area, doc.type], doc.name); > >> ?? ?? ?? } > >> ?? ?? } > >> > >> You can then query with startkey=[75018, null] and endkey=[75018, {}] > >> to get all restaurants in the 75018 area. > >> > >> The null and {} might look a bit weird at first but it's all to do > >> with how CouchDB orders rows in a view. See > >> http://wiki.apache.org/couchdb/View_collation#Collation_Specification > >> for details. > >> > >> Hope this helps. > >> > >> - Matt > >