我有一个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指定我们可以使用启动密钥和结束密钥。但我无法让它发挥作用。
由于
答案 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)
这个解决方案怎么样:
这有一个缺点,即每个产品我们都必须创建一个视图,这看起来像一个手动过程。
只是一个想法!让我知道你的看法。