3

假设我有一个包含 239800 个文档的列表,如下所示:

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

我知道我可以通过doc.data.age, doc.data.income,来索引文档heightdumplings_consumed并在为每个参数提供一个范围之后获取文档列表,但是如何获得如下查询的结果:

年龄在 25 到 30 岁之间、收入低于 10 美元且身高超过 7 英尺的医生名单?

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

4

2 回答 2

2

假设您的所有三个示例查询参数都需要保持动态,您将无法使用单个 CouchDB 查询进行这样的连接。最简单的策略是发出一个索引,让您缩小数据的“最大”方面/维度,然后在您的应用程序代码或 _list 函数中过滤掉其余部分。

现在,为了过滤数字数据的两个方面,GeoCouch可能会被使用——它提供了一个通用的二维索引,而不仅限于纬度和经度!因此,您将发出包含(例如)映射到 x 和 y 的“年龄”和“收入”的点。然后,您将使用前两个“中间”参数查询一个 bbox,然后您只需在应用程序端过滤掉高度。

于 2012-11-09T23:01:46.297 回答
1

让我们看一下:

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

您可以使用任何您想要的表达式(javascript 代码)进行搜索并用它来索引文档。

例如,通过蒲团,您可以创建一个测试数据库,并根据您的问题添加以下两个文档:

{“_id”:“36fef0472fb7eec035c87e4f4b0381bf”,“_rev”:“12-4ef9014a3670a7e6acd58ad92d26fc1e”,“数据”:{“年龄”:6,“收入”:10,“身高”:20,“dumplings_consumed”:5},“名称”:“乔”}

{“_id”:“36fef0472fb7eec035c87e4f4b038ffa”,“_rev”:“8-f0a0a51b830bf3d4bc3ec5697440792f”,“姓名”:“迈克”,“数据”:{“年龄”:27,“收入”:9,“身高”:78, “dumplings_consumed”:256 } }

您只需要使用 Futon 访问您的数据库并使用以下 Map 函数创建一个临时视图:

function(doc) { var 年龄、收入、身高;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-tree 是建立起来的,这需要时间。即使将文档添加到数据库中,进一步的执行也应该非常快(只要它们的数量是总数的一小部分)

于 2013-09-03T06:00:47.013 回答