如何使用复合键查询CouchDB视图?
我有一个名为“record_by_date_product”的CouchDB视图,定义如下:
function(doc) {
emit([doc.logtime, doc.product_id], doc);
}
我想运行一个查询,类似于:
(logtime > fromdate & logtime < todate) & product_id in (1,2,6)
这个视图可以做到吗?
我还在使用CouchDB的Python库来访问CouchDB。这里有一段代码:
server = couchdb.Server()
db = server['mydb']
results = db.view('_design/record_by_date_product/_view/record_by_date_product')
这个页面 http://packages.python.org/CouchDB/client.html#viewresults 指出我们可以使用startkey和endkey。不过我没有成功。
谢谢
3 个回答
-1
这个解决方案怎么样:
- 我为每个产品创建一个视图,使用日志时间作为索引。
- 如果需要,就访问每个视图,并用一个范围来过滤结果 - [开始日期 到 结束日期]
- 对输入参数中的每个产品都做第3步,然后把结果整理在一起。
这个方法的一个缺点是,我们需要为每个产品都创建一个视图,这看起来像是一个手动的过程。
只是一个想法!告诉我你的看法。
3
这个具体的查询是无法实现的。正如文档所说,你可以在特定的键范围内获取视图中的所有内容。视图是一种有序的数据结构,所以CouchDB为了满足这个请求,只需找到开始的键,然后开始返回数据,直到达到结束的键。
你在进行这个查询时应该考虑数据本身的特点。最重要的是,如果你只使用键的第一部分(logtime
),然后在Python中逐个筛选那些product_id
不匹配的项目,这样会浪费很多时间吗?如果会的话,你应该考虑写一个主要按product_id
排序的视图。如果不会,那就继续使用筛选的方法吧。
5
我想我找到了确切的答案:
设计一个叫做'sampleview'的视图,内容大概是这样的:
{
"records_by_date_product": {
"map": "function(doc) {\n emit([doc.prod_id, doc.logtime], doc);\n}"
}
}
假设查询参数是:
prod_id in [1,3]
from_date = '2010-01-01 00:00:00'
to_date = '2010-01-02 00:00:00'
那么你需要在同一个视图上运行两个不同的查询:
http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\["1,2010-01-01%2000:00:00"\]'&endkey='\[1,"2010-01-02%2000:00:00"\]'
http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\[2,"2010-01-01%2000:00:00"\]'&endkey='\[2,"2010-01-02%2000:00:00"\]'
注意,每次运行的查询基本相同,只是第二个查询中的prod_id(产品ID)不同。最后需要把结果整理在一起。希望这能帮到你!