Couchdb查询根据键输入计算的值

  • 本文关键字:计算 查询 Couchdb 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中是否可以实现这样的功能。

您可以使用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时(取决于您访问DB的方法),您应该指定reduce=true

MapReduce(以及视图、排序和列表功能)上的好资源有:

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

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

有关List函数的详细说明,请查看此处:http://guide.couchdb.org/draft/transforming.html

希望这能有所帮助。

最新更新