假设我的数据库中有以下数据:
[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
希望这能有所帮助。