【问题标题】:How to query a couchdb view using a composite key?如何使用复合键查询 couchdb 视图?
【发布时间】:2011-01-13 13:48:03
【问题描述】:

我有一个 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。这是一个代码sn-p:

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 指定我们可以使用开始键和结束键。但我无法让它工作。

谢谢

【问题讨论】:

    标签: python couchdb composite-key


    【解决方案1】:

    我想我刚刚找到了确切的答案:

    设计一个视图“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。结果需要稍后整理。希望这会有所帮助!

    【讨论】:

    • 你只是一个人,对吧?您刚刚回答了自己的问题并说“希望这会有所帮助”。无论如何,这是行不通的,因为键的顺序是错误的。 [start_date, 1][end_date, 1] 之间的范围将包含很多您不想要的内容,例如产品 id=2 的日期范围内的所有内容。如果您在日期之前发出产品 ID,这起作用。
    • 呵呵!我认为这也会对其他人有所帮助! :) 你是对的,我将不得不反转键顺序,然后查询视图。让我对解决方案进行编辑。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这个解决方案怎么样:

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

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

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

      【讨论】:

      • 它可以比这更简单。只需颠倒您的密钥顺序,以便文档首先按产品排序,然后按 logtime。查询同一视图 3 次,在您想要的时间范围内查找每个产品。这是我提交的答案中的第二个建议,所以如果您喜欢它,请将其标记为已接受:)
      • 你好,我应该如何“在时间范围内寻找每个产品”?我想这正是我问的问题。事实上,我们只能将日期或范围 [startdate enddate] 发送到视图。但我们不能同时发送范围和产品 ID。我正在考虑使用接受任意数量的查询参数的列表。将提供更新。谢谢!
      • 您可以同时查找范围和产品ID。 CouchDB 视图可以使用组合键,并且您提供了一个如何构建组合键的示例。您所要做的就是颠倒您的密钥的顺序,使其成为[doc.product_id, doc.logtime]。要查询它,请按照您链接到的文档,使用相同的两项格式的 startkeys 和 endkeys。
      • 作为记录,您可以使用临时视图,也可以(在获得许可的情况下)像任何其他数据一样将视图写入 Couch。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 2011-09-04
      相关资源
      最近更新 更多