1

我在couchdb中遇到了以下问题。想象一下以下文档结构

{名称:“测试”,时间戳:12334567,值:335}

我的任务是在特定时间范围内查询所有值大于 X 的文档。在 SQL 中,这类似于

SELECT * FROM doc where timestamp>=X and timestamp < Y and value>Z

Z 值应该是动态的,所以我不能在发射之前进行过滤。

我已经在使用 startkey 和 endkey,但是这篇文章 startkey 和 endkey 在 CouchDB 中究竟是如何工作的? 帮助我理解这是错误的方法。

有人可以给我一个提示如何在couchdb中解决这样的问题吗?

提前致谢。

4

1 回答 1

2

您需要为要查询的每个列创建一个索引,并在客户端执行逻辑操作。

在您的情况下,我建议创建以下视图:

    function(doc) {
        emit(['by_timestamp', doc.timestamp], null);
        emit(['by_value', doc.value], null);
    }

现在使用以下参数查询您的视图:

  • ?startkey=['by_timestamp', X]&endkey=['by_timestamp', Y]
  • ?startkey=['by_value', Z]&endkey=['by_value', {}]

得到结果后,在客户端执行两个查询返回的文档 ID 的集合交集。

一旦你有了它,你就可以通过 POST 查询获得结果/dbname/_all_docs?include_docs=true,在帖子正文中放置 jsoned dict:

{keys: [...]}

瞧。

注意:作为替代方案,您可以考虑为每个索引使用单独的 map() 函数。通过这种方式,您可以提高新/更新文档索引速度较慢的查询速度。

于 2013-09-24T11:44:26.933 回答