2013-07-27 92 views
2

我试图找出地图功能,减少功能为以下情况:CouchDB的地图功能,减少功能

文件:

{ 
"_id" : "1_A", 
"key1": 10, 
"key2": 10 
} 

{ 
"_id" : "2_A", 
"key1": 2, 
"key2": 3 
} 
{ 
"_id" : "1_B", 
"key1": 20, 
"key2": 20 
} 

{ 
"_id" : "2_B", 
"key1": 1, 
"key2": 0 
} 

期待有:在所有id文档中的每个键(key1,key2 ... keyn)的和分别以“_A”,“_B”...“_Z”结尾。

在这种情况下,期望具有sumA:“key1”:12,“key2”:13。和sumB:“key1”:21,“key2”:20;

我一直在研究地图功能(doc),在我看来,它只处理一次指定为“doc”值的文档。

有没有办法达到预期的效果?反正像SQL连接?

+0

是我的回答对您有所帮助?或者您是否需要更多信息,即我没有提供足够的细节? – thriqon

回答

1

是的,这是可能的!您将必须在此发出复合密钥,如下所示:["A", 1]代表的值,idA结尾。

例如在地图:

function (doc) { 
    for (var k in doc) { 
     if (k !== '_id' && k !== 'rev') { 
      emit([doc._id.substr(doc._id.length - 1), k.substr(k.length - 1)], 
       doc[k]); 
     } 
    } 
} 

为了减少您要使用的内置函数_sum性能。

然后可以使用group=true作为URL参数,可能通过使用startkeyendkey(例如["A"]["A", {}])限制值,以只有那些具有后缀A查询这些总和。

在这种情况下,结果将是:

{"rows":[ 
    {"key":["A","1"],"value":12}, 
    {"key":["A","2"],"value":13}, 
    {"key":["B","1"],"value":21}, 
    {"key":["B","2"],"value":20} 
]} 
+0

它有帮助,现在我有另一个问题,这是这个问题的后果:请看看 http://stackoverflow.com/questions/18079917/couchdb-view-using-another-view – user2625363