incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Matt Goodall <matt.good...@gmail.com>
Subject Re: Newbie :Filtering using complex key and array
Date Fri, 20 Nov 2009 12:15:59 GMT
2009/11/20 Sebastien PASTOR <sebastien.pastor@gmx.com>:
> 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

Mime
View raw message