创建从文档集中返回唯一值数组的couchdb视图
我有一个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
{ 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:关于这个有什么进一步的想法吗?我还是不明白,谢谢!我会看一看,并让你知道它是如何工作的。请注意,我写的代码是“自由风格”。我希望没有错误:)