Couchdb查询从键输入计算的值

时间:2015-02-17 08:43:28

标签: couchdb

假设我的数据库中包含以下数据:

[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中是否可以使用这样的东西。

1 个答案:

答案 0 :(得分:0)

您可以做的是使用CouchDB的标准MapReduce功能。 Map是放在视图中的函数,用于查找数据。您可以使用各种条件来查找所需的文档。接下来,如果在查询中使用reduce = true指定so,则会对匹配映射条件的每个文档执行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

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

有关列表功能的详细说明,请查看此处: http://guide.couchdb.org/draft/transforming.html

希望这有帮助。