如何使用复合键查询couchdb视图?

时间:2011-01-13 13:48:04

标签: python couchdb composite-key

我有一个couchdb视图“record_by_date_product”,其定义如下:

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指定我们可以使用启动密钥和结束密钥。但我无法让它发挥作用。

由于

3 个答案:

答案 0 :(得分: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'

然后,您必须在同一视图上运行2个单独的查询:

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之外,每次都运行相同的查询。结果必须在以后整理。希望这有帮助!

答案 1 :(得分:3)

这个确切的查询是不可能的。正如文档所示,您可以在特定键范围内获取视图中的所有内容。视图是排序的数据结构,因此所有CouchDB完成此请求所做的就是找到开始键并开始返回项目,直到您点击结束键。

您应该用于此查询的策略取决于数据本身的特征。最重要的是,如果您仅使用密钥的第一部分(logtime)并在Python中迭代这些项目,那么您是否会浪费大量时间来清除项目,从而清除product_id不匹配的项目?如果是这样,您应该考虑编写另一个主要按product_id排序的视图。如果没有,请继续使用淘汰方法。

答案 2 :(得分:-1)

这个解决方案怎么样:

  1. 我使用logtime作为索引为每个产品创建一个视图。
  2. 如果需要,访问每个视图并使用范围 - [fromdate todate]
  3. 过滤结果
  4. 输入参数中的每个产品执行3并整理结果
  5. 这有一个缺点,即每个产品我们都必须创建一个视图,这看起来像一个手动过程。

    只是一个想法!让我知道你的看法。