CouchDB组视图保持字符串键和值

时间:2016-05-09 16:22:53

标签: couchdb grouping

我有一个{key:[year,month,day,string],value:int}

形式的文档视图
{
   rows:[
    {
    key: [
     2016,
     4,
     30,
     "String1"
    ],
    value: 20
    },
    {
     key: [
    2016,
     4,
    30,
    "String2"
     ],
    value: 7
     },
    {
    key: [
    2016,
    4,
    30,
    "String3"
     ],
    value: 13
     },{
    key: [
    2016,
    5,
    1,
    "String1"
    ],
    value: 10
    },
    {
    key: [
    2016,
    5,
    1,
    "String4"
    ],
    value: 12
    },{
    key: [
    2016,
    5,
    2,
    "String1"
    ],
    value: 3
    },
]}

从此我使用startkeyendkey按日期获取一系列值。我的问题是然后将密钥字符串返回的文档分组,并将值int求和。密钥的其余部分可能存在也可能不存在,这无关紧要。到目前为止,对于组级别,我只能对每个日期键进行求和。

当在表格中呈现时,我得到类似的东西: enter image description here

我想要的是:

enter image description here

2 个答案:

答案 0 :(得分:0)

所以我最终使用javascript在我的控制器中减少:

    $scope.reduceMap = function (rows) {
    var reducedMap = {};
    var sortableArray = [];
    for (var i = 0; i < rows.length; i++) {
        var key = rows[i].key[3];
        if (!reducedMap.hasOwnProperty(key)) {
            reducedMap[key] = {key: key, value: rows[i].value};
        } else {
            reducedMap[key] = {key: key, value: rows[i].value + reducedMap[key].value};
        }
    }
    for (var k in reducedMap) {
        sortableArray.push(reducedMap[k]);
    }
    return sortableArray;
};

由于我要求CouchDB回答,我会留在这里但不接受它。

答案 1 :(得分:0)

如果您将视图的键发布为:string, year, month, day并使用内置的reduce函数_sum,则以下URL示例将为您提供所需的结果: http://localhost:5984/text/_design/search/_view/by_text?startkey=["",2016,1,1]&endkey=[{},2016,1,1]&group_level=1

您的日期搜索条件指定为正常,但密钥的第一部分基本上是任何字符串。然后对级别1进行分组并使用总和减少为您提供字符串出现次数,其中日期范围按字符串分组。