2009/11/20 Sebastien PASTOR <[email protected]>:
> 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