5

我有一个具有以下定义的 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指定我们可以使用 startkey 和 endkey。但我无法让它工作。

谢谢

4

3 回答 3

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。结果需要稍后整理。希望这可以帮助!

于 2011-01-14T18:44:57.367 回答
3

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

您应该为此查询使用的策略取决于数据本身的特征。logtime最重要的是,如果您只使用键 ( ) 的第一部分并在 Python 中遍历那些内容,剔除product_id不匹配的项目,您会浪费大量时间剔除项目吗?如果是这样,您应该考虑编写另一个主要按 排序的视图product_id。如果没有,请继续使用清除方法。

于 2011-01-13T14:00:45.693 回答
-1

这个解决方案怎么样:

  1. 我为每个产品创建一个视图,以 logtime 作为索引。
  2. 如果需要,访问每个视图并使用范围过滤结果 - [fromdate todate]
  3. 对输入参数中的每个产品做3个并整理结果

这有一个缺点,我们必须为每个产品创建一个视图,这看起来像是一个手动过程。

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

于 2011-01-14T08:17:15.097 回答