12

根本问题 - 假设我的文档有“类别”时间戳。如果我想要时间戳在过去两个小时内的“foo”类别中的所有文档,这很简单:

function (doc) {
  emit([doc.category, doc.timestamp], null);
}

然后查询为

GET server:5894/.../myview?startKey=[foo, |now - 2 hours|]&endkey=[foo, |now|]

当我在过去两个小时内想要foobar类别的东西时,问题就来了。如果我不在乎时间,我可以直接通过键集合通过键拉。不幸的是,我对范围没有这样的选择。

在此期间我最终做的是将时间戳四舍五入到两个小时的块,然后将查询多路复用:

POST server:5894/.../myview
keys=[[foo, 0 hours], [foo, 2 hours], [bar, 0 hours], [bar, 2 hours]]

它可以工作,但是如果我想返回大量时间(与块大小有关)会变得混乱。

有没有办法将多个 startKey/endKey 对发送到视图,类似于可以为键发布的键:[] 数组?

4

3 回答 3

9

有一个 CouchDB 问题请求可以让您这样做。我已在该票证上附加了一个简单的、无保证的 0.10.1 补丁,它可能对您有用。它对我有用,让我可以做以下事情:

{
    "keys": [
        {
            "startkey": ["0240286524","2010","03","01"],
            "endkey": ["0240286524","2010","03","07",{}]
        },
        {
            "startkey": ["0442257276","2010","03","01"],
            "endkey": ["0442257276","2010","03","07",{}]
        }
    ]
}

在 POST 正文中,它让我可以跨多个跟踪 ID 获取一系列日期的所有数据。我打电话group=true&group_level=1让结果按跟踪 ID 分组。更深的组级别将允许我通过跟踪 id|year、跟踪 id|year|month 等进行分组。

多个连接对我来说是不可扩展的开销,因为我希望同时创建 2000 个 :) (不,新视图不是一个选项 - 我们已经有 400GB 的数据和一个视图!)

问题和补丁位于https://issues.apache.org/jira/browse/COUCHDB-523

于 2010-03-24T00:11:16.640 回答
4

你最好只做两个查询。CouchDB 可以很好地处理多个同时查询,因此分拆多个进程/线程并分别查询 foo 和 bar 文档。

CouchDB 目前不支持多范围查询。ORing 和 ANDing 键在一个查询中几乎是不可行的。

于 2009-09-24T03:13:18.617 回答
4

这已添加到较新版本的 CouchDB 中。要添加多个范围的开始/结束键,您可以对视图使用 POST 请求,其正文如下所示:

{
  "queries": [
    { "startkey": 10, "endkey": 11 },
    { "startkey": 16, "endkey": 18 }
  ]
}

我知道这是一个老问题,但我最初是在寻找这个问题时发现的!

于 2017-03-21T17:20:36.043 回答