Search code examples
mapreducecouchdbcouchappnon-relational-database

Couchdb: relational database capabilities


Let's assume that I have a list of 239800 documents like the following:

{
    name: somename,
    data:{age:someage, income:somevalue, height:someheight, dumplings_consumed:somenumber}
}

I know that I can index the doc by doc.data.age, doc.data.income, height, dumplings_consumed and get list of the doc that after giving a range for each parameters but how can I get a result for query like following:

List of the docs where age is between 25 and 30, income is less than $10 and height is more than 7ft?

Is there a way to get multiple indexes working?


Solution

  • Assuming all three of your example query parameters need to remain dynamic, you would not be able to do such a join with a single CouchDB query. The simplest strategy would be to emit an index that lets you narrow down the "biggest" aspect/dimension of your data, and then filter the rest out in your app's code or a _list function.

    Now, for filtering on two aspects of numeric data, GeoCouch could potentially be used — it provides a generic 2-dimensional index, not just limited to latitude and longitude! So you would emit points that contain (say) "age" and "income" mapped to x and y. You'd then query a bbox with first two "between" parameters, and then you'd only have to filter out height on the app side.