创建从文档集中返回唯一值数组的couchdb视图

创建从文档集中返回唯一值数组的couchdb视图,couchdb,Couchdb,我有一个couchdb数据库,里面装满了带时间戳的文档,因此给定文档的格式如下: { id: "uniqueid", year: 2011, month: 3, day: 31, foo: "whatever" bar: "something else" } 我想构造一组视图,这样一个给定的键将返回文档存在的年、月或日值数组。例如,给定视图名Days,我想要以下视图url /db/_design/designdoc/_view/Days?key=[2011,3] 返回20

我有一个couchdb数据库,里面装满了带时间戳的文档,因此给定文档的格式如下:

{ id: "uniqueid",
  year: 2011,
  month: 3,
  day: 31,
  foo: "whatever"
  bar: "something else"
}
我想构造一组视图,这样一个给定的键将返回文档存在的年、月或日值数组。例如,给定视图名
Days
,我想要以下视图url

/db/_design/designdoc/_view/Days?key=[2011,3]
返回2011年3月存在文档的所有日期的数组。例如,如果2011年3月有一定数量的文档落在6天内,那么它可能看起来像:

[1, 2, 5, 15, 27, 31]
[4, 5, 9]
[2010, 2011]
同样地

/db/_design/designdoc/_view/Months?key=2011
如果2011年4月、5月和9月有一定数量的文档,它可能看起来像:

[1, 2, 5, 15, 27, 31]
[4, 5, 9]
[2010, 2011]

将返回整个数据库中的年数组。如果这些文件是今年和去年的,它可能看起来像:

[1, 2, 5, 15, 27, 31]
[4, 5, 9]
[2010, 2011]
我推测,编写返回数组的reduce函数很困难,因为随着文档计数的增加,最终会遇到reduce溢出错误。我之所以知道这一点,是因为我编写了一个reduce函数,该函数可以正常工作,但在加载文档后开始抛出reduce溢出错误

我研究过的一种解决方案是只创建一个视图而不使用reduce,该视图创建一个数组键
[year,month,day]
,然后在视图上使用
startkey
endkey
参数返回文档。这种方法的问题在于它如何扩展。假设我的数据库在两年内有数千份文档。使用这个视图,我需要遍历整个文档集来发现这一点


我相信他也在试图问同样的问题,虽然我不太确定,所以我想我应该添加一个新问题。此外,就我有限的视图编写技能而言,这个问题的答案并不能避免减少较大文档集的溢出错误。

我认为,为此,您不仅需要使用地图,还需要使用地图来构建视图。

忽略最终的缩放问题,有两种解决方案。我将只考虑几天,因为数月和数年的答案是相似的

解决方案1:

查看天数:

地图:

减少:

function(keys, values) {
    return sum(values);
}
列表日期:

function(head, req) {
    start({
        "headers": {
            "Content-Type": "text/plain"
        }
    });
    var row;
    var days = new Array();
    while(row = getRow()) {
        days.push(row.key[2]);
    }
    var daysString = json.join(',');
    send('[' + daysString + ']');
}
function(head, req) {
    start({
        "headers": {
            "Content-Type": "text/plain"
        }
    });
    var row;
    var days = new Array();
    while(row = getRow()) {
        if (days.indexOf(row.key[2] == -1) { days.push(row.key[2]); }
    }
    var daysString = json.join(',');
    send('[' + daysString + ']');
}
http调用:

http://couch/db/_design/db/_list/listDays/Days?group=true&group_level=2&startkey=["2011","3"]&endkey=["2011","3Z"]
http://couch/db/_design/db/_list/listDays/Days?startkey=["2011","3"]&endkey=["2011","3Z"]
解决方案2:

查看天数:

地图:

列表日期:

function(head, req) {
    start({
        "headers": {
            "Content-Type": "text/plain"
        }
    });
    var row;
    var days = new Array();
    while(row = getRow()) {
        days.push(row.key[2]);
    }
    var daysString = json.join(',');
    send('[' + daysString + ']');
}
function(head, req) {
    start({
        "headers": {
            "Content-Type": "text/plain"
        }
    });
    var row;
    var days = new Array();
    while(row = getRow()) {
        if (days.indexOf(row.key[2] == -1) { days.push(row.key[2]); }
    }
    var daysString = json.join(',');
    send('[' + daysString + ']');
}
http调用:

http://couch/db/_design/db/_list/listDays/Days?group=true&group_level=2&startkey=["2011","3"]&endkey=["2011","3Z"]
http://couch/db/_design/db/_list/listDays/Days?startkey=["2011","3"]&endkey=["2011","3Z"]

我对这个问题的回答被打断了。对不起,请再看一眼。我正在努力理解你的问题。我编辑它以显示预期的输出。我的理解正确吗?如果是的话,我会写一个答案。谢谢。@jhs,是的,这是正确的。谢谢你说得更清楚。@jhs:关于这个有什么进一步的想法吗?我还是不明白,谢谢!我会看一看,并让你知道它是如何工作的。请注意,我写的代码是“自由风格”。我希望没有错误:)