【问题标题】:CouchDB Where conjunctionCouchDB Where 连接
【发布时间】:2013-09-29 13:02:00
【问题描述】:

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

{name:"test",timestamp:12334567,value:335}

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

SELECT * FROM doc where timestamp>=X and timestamp Z

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

我已经在使用 startkey 和 endkey,但是这篇文章 How exactly is startkey and endkey working in CouchDB? 帮助我理解这是错误的方法。

谁能给我一个提示,如何在 couchdb 中解决这样的问题?

提前致谢。

【问题讨论】:

    标签: couchdb where-clause couchdb-futon


    【解决方案1】:

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

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

        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() 函数。通过这种方式,您可以提高新/更新文档索引速度较慢的查询速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多