2017-01-04 8 views
0

CloudAntでは、トピックと評議会という2つの属性でグループ化された機能の数を取得したいと考えています。多くの手品をした後、私はこれを構築することができました:CloudantでCOUNT ... GROUP BYを模倣する(CouchDB)

// map 
function (doc) { 
    if (doc.properties && doc.properties.openCouncilDataTopic) { 
    var ret = {}; 
    ret [doc.properties.openCouncilDataTopic] = {}; 
    ret [doc.properties.openCouncilDataTopic][doc.properties.sourceCouncilId] = 1; 

    emit(null, ret); 
    } 
} 

// reduce 
function (keys, values, rereduce) { 

    var ret = values[0]; 

    function zero(x) { return x ? x : 0 } 
    function add(i, topic, id) { 
     ret[topic][id] = zero(ret[topic][id]) + values[i][topic][id]; 
    } 
    function countTopic(topic) { 
     if (!ret[topic]) 
      ret[topic] = {}; 
     Object.keys(values[i][topic]).forEach(add.bind(undefined, i, topic)); 
    } 
    for (var i = 1; i < values.length; i++) { 
     Object.keys(values[i]).forEach(countTopic); 
    } 
    return ret; 
} 

良い方法はありますか?

答えて

0

はい、より良い方法があります。その後、我々は、機能を減らす内蔵の_countを使用することができます

function (doc) { 
    if (doc.properties && doc.properties.openCouncilDataTopic) { 
    emit([doc.properties.openCouncilDataTopic, doc.properties.sourceCouncilId], 1); 
    } 
} 

:Cloudantが代わりに手動でカウントを計算する「aggregation over complex keys

をサポートし、map機能は単純にグループの属性である鍵を発することができます。

ビューを呼び出すには、group_by=2を追加します.2はグループ化する属性の数です。 (デフォルトは0で、すべてを1つの数値に集約します)。

これは、Javascriptでもカウントを実装するよりもはるかに高速になる可能性があります。

{ 
    "rows": [ 
    { 
     "key": [ 
     "childcare-centres", 
     "https://data.gov.au/organization/cardinia-shire-council" 
     ], 
     "value": 22 
    }, 
    ... 
} 

一つの欠点は、私たちはこのように出てくる出力、を制御しにくい持っています