CouchDB:关系型数据库功能

3
假设我有一个包含239800个文件的列表,如下所示:
{
    name: somename,
    data:{age:someage, income:somevalue, height:someheight, dumplings_consumed:somenumber}
}

我知道可以通过doc.data.agedoc.data.incomeheightdumplings_consumed来索引文档,并获取每个参数范围内的文档列表,但如何查询以下内容的结果呢?

年龄在25到30之间,收入小于10美元,身高超过7英尺的文档列表?

有没有办法让多个索引同时工作?

2个回答

2
假设您的三个示例查询参数都需要保持动态,您将无法使用单个CouchDB查询进行此类连接。最简单的策略是发出一个索引,让您缩小数据的“最大”方面/维度,然后在应用程序代码或_list函数中过滤其余部分。
现在,对于筛选数字数据的两个方面,GeoCouch 可能会被使用——它提供了一个通用的二维索引,不仅限于纬度和经度!因此,您将发出包含(例如)“年龄”和“收入”映射到x和y的点。然后,您将查询第一和第二个“之间”的参数的bbox,然后您只需要在应用程序端过滤高度即可。

1
让我们来看一下:

http://guide.couchdb.org/draft/views.html

您可以使用任何表达式(JavaScript代码)进行搜索,并将其用于索引文档。
例如,通过Futon,您可以创建一个测试数据库,并根据您的问题添加以下两个文档:
{“_id”:“36fef0472fb7eec035c87e4f4b0381bf”,“_rev”:“12-4ef9014a3670a7e6acd58ad92d26fc1e”,“data”:{“age”:6,“income”:10,“height”:20,“dumplings_consumed”:5},“name”:“joe”}
{“_id”:“36fef0472fb7eec035c87e4f4b038ffa”,“_rev”:“8-f0a0a51b830bf3d4bc3ec5697440792f”,“name”:“mike”,“data”:{“age”:27,“income”:9,“height”:78,“dumplings_consumed”:256}}
您只需使用Futon进入您的数据库并创建一个临时视图,其中包含以下Map函数即可。

function(doc) { var age, income, height; if (doc.name && doc.data && doc.data.age && doc.data.income && doc.data.height) { if ( doc.data.age > 25 && doc.data.age < 30 && doc.data.income < 10 && doc.data.height > 7) { emit(doc.name, doc.data); } } }

只需运行即可获得结果。

使用永久视图,第一次执行请求时,内部B树会被构建并且需要时间。即使向数据库添加文档(只要它们的数量是总数的一小部分),后续执行也应该非常快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接