2011-04-02 61 views
2

我充满了时间标记的文档的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] 

在三月份回到2011年该文件存在的所有日子的数组。举例来说,如果2011年3月曾掉落六天文档一些数字,它可能看起来像:

[1, 2, 5, 15, 27, 31] 

同样,

/db/_design/designdoc/_view/Months?key=2011 

如果2011有掉落在四月,五月的文档一些号码,和9月,它可能看起来像:

[4, 5, 9] 

而且

/db/_design/designdoc/_view/Years 

将在整个数据库中返回一个数组。如果文件今年和去年都有,它可能看起来像:

[2010, 2011] 

我推测它是很难写一个reduce函数,因为你最终运行到减少溢出错误的文件数的增加,返回数组。我知道这一点,因为我编写了一个可以工作的reduce函数,但是在我用文档加载后,开始抛出溢出错误。

一个解决方案我已经研究只是创建一个视图没有减少使用创建的视图startkeyendkey参数返回文档的数组键[year, month, day]然后。这种方法的问题在于它如何扩展。假设我的数据库拥有数以千计的文件分散在两年以上。使用这个视图,我需要遍历整个文档集才能发现它。

我相信this question试图问同样的事情,虽然我不太确定所以我想我会添加一个新的问题。此外,就这个问题给出的答案并不能避免减少大型文档集的溢出错误,就我所能看到的有限视图写作技巧而言。

+0

我对这个问题的答案已被打破。对不起。 [我已更新](http://stackoverflow.com/questions/5456682/return-unique-values-by-key-in-couchdb/5476831#5476831),请再看一看。 – 2011-04-03 11:58:59

+0

我想了解你的问题。我编辑它以显示预期的输出。我的理解是否正确?如果是这样,我会写一个答案。谢谢。 – JasonSmith 2011-04-04 05:23:28

+0

@jhs,是的,这是正确的。感谢您使它更加清晰。 – stand 2011-04-04 06:17:29

回答

1

我认为这一点,你需要构建你的意见不仅与地图,但也与reduces

0

无视最终的缩放问题,有两种解决方案。由于“月份”和“年份”的答案类似,因此我只会考虑天数。

解决方案1:

视图天数:

地图:

function(doc) { 
    if (doc.year && doc. month && doc.day) { 
     emit([ year, month, day ], 1); 
    } 
} 

减少:

function(keys, values) { 
    return sum(values); 
} 

列表listDays:

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 + ']'); 
} 

HTTP调用:

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

解决方案2:

视图天:

地图:

function(doc) { 
    if (doc.year && doc. month && doc.day) { 
     emit([ year, month, day ], null); 
    } 
} 

列表listDays:

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?startkey=["2011","3"]&endkey=["2011","3Z"] 
+0

谢谢!我会看看这个,并让你知道它是如何工作的。 – stand 2012-08-18 00:41:15

+0

请注意,我以“自由风格”编写了代码。我希望没有错误:) – 2012-08-18 07:06:24