【问题标题】:Couchdb query for values calculated from key inputCouchdb 查询从键输入计算的值
【发布时间】:2015-02-17 08:43:28
【问题描述】:

假设我的数据库中有以下数据:

[1,2],[2,1],[1,3],[3,1]...

数字代表公式a*x+b的a和b值吗

我现在想要的是一个返回给定点 x,y 的差的查询。

例如:给定点 [2,6]。我希望我的查询返回

[1,2] = -2 (1*2+2=4  4-6=-2)
[2,1] = -1 (2*2+1=5  5-6=-1)
[1,3] = -1 (1*2+3=5  4-6=-1)
[3,1] =  1 (3*2+1=7  7-6=-1)

我知道如何在 SQL 中执行此操作,但数据已经在 couchdb 中。我对 NoSQL 世界很陌生,想知道在 couchdb 中是否可以实现这样的事情。

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    您可以做的是使用 CouchDB 的标准 MapReduce 功能。 地图是您放在视图中的功能,它可以找到您的数据。您可以有各种标准来找到您需要的文档。接下来,如果您在 reduce=true 的查询中指定,则在每个匹配 map 条件的文档上执行一个 reduce 函数。您可以使用 JavaScript 对文档的值执行各种操作。 在您的情况下,地图可能如下所示:

    function(doc) {
        if(doc.a && doc.b) {
            emit(doc._id,[doc.a, doc.b]);
        }
    }
    

    然后,reduce 被调用,如下所示:

    function(keys, values, rereduce) {
        var res;
       //do something with values...
       return res;
    }
    

    在您的情况下,keys 将是文档 ID 的列表,values 将是您的 a 和 b 字段的数组。

    当您调用 MapReduce(取决于您使用什么方法访问数据库)时,您应该指定reduce=true

    关于 MapReduce(以及关于视图、排序和列表功能)的良好资源是:

    http://guide.couchdb.org/draft/views.html http://www.slideshare.net/okurow/couchdb-mapreduce-13321353

    如果您想以 HTML 格式输出结果,另一种方法是在 Map 结果上使用列表函数。使用 List 函数的一个很好的理由是您可以使用查询字符串将参数传递给它,在您的情况下,它可能是您想要计算距离的点。

    关于 List 函数的详细说明,请看这里: http://guide.couchdb.org/draft/transforming.html

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复。 map reduce 的问题是我无法访问 startkey、endkey 或 key。所以缺少计算的一个重要部分,即上面公式中的 x 值。列表函数是否比获取所有文档并在......比如说...... node.js 中执行搜索更快?无论如何,我会看看列表,谢谢!
    • 当然可以使用node.js。至于速度,我只能猜测在 Couch DB 中运行它并仅返回结果会比在 node.js 中获取所有文档并在那里计算要快。取决于文档的数量和它们的大小 - 它们是否只有这两个值,或者还有其他数据。
    • 这只是一个简单的例子,数学表达式在现实生活中更复杂(14个变量)......但只有几百个文档。使用简单的地图功能可以将文档的大小减少到只有几个需要的字段......我将对这两种方法进行一些性能测试。无论如何,感谢您的帮助!
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多