我有大量文件,每一份都有效。范围可以从1周到1年。我希望能够获得在特定日期有效的所有文件。
我该怎么做?
举个例子说我有以下两个文件:
doc1 = {
// 1 year ago to today
start_at: "2012-03-22T00:00:00Z",
end_at: "2013-03-22T00:00:00Z"
}
doc2 = {
// 2 months ago to today
start_at: "2012-01-22T00:00:00Z",
end_at: "2013-03-22T00:00:00Z"
}
一个地图功能:
(doc) ->
emit([doc.start_at, doc.end_at], null)
因此,对于6个月前的日期,我只会获得doc1,一个星期前的日期我会得到这两份文件,并且明天的日期我将不会收到任何文件。
请注意,实际的分辨率需要降低到正在发出的请求的第二个,并且有很多文档,因此每个有效秒发出密钥的策略都不合适。
答案 0 :(得分:1)
您可以在您的范围内每天拨打发票,然后您可以轻松挑选特定日期的可用文件。
function(doc) {
var day = new Date(doc.start),
end = new Date(doc.end).getTime();
do {
emit(day);
day = new Date(day.getFullYear(), day.getMonth(), day.getDate() + 1);
} while (day.getTime() <= end);
}
即使您将拥有大量文档,如果省略了您的emit的值部分(第2个参数),索引也将尽可能小。
如果您需要更复杂,可以尝试couchdb-lucene。您可以将日期字段编入索引作为日期对象,并在1个请求中使用多个字段执行范围查询。
答案 1 :(得分:0)
您可以将问题转化为位置的计算几何问题。对于二维平面[x,y]=[start_at,end_at]
中的文档,对于那些在日期date
有效的查询,是由left=-infinity, right=date
(start_at<date
)所限定的矩形中的点列表, bottom=date, top=infinity
(end_at>date
)。
不幸的是,CouchDB团队低估了计算几何的力量,并且不支持多维查询。 GeoCouch扩展允许您像以下一样简单地执行此类查询:
http://localhost:5984/places/_design/main/_spatial/points?bbox=0,0,180,90
在视图上发射空间值:
emit({ type: "Point", coordinates: [doc.start_at, doc.end_at] }, doc);
问题是不同的数据类型。浮点范围为[-180.0,180.0]/[-90.0,90.0]
,至少需要int
(UNIX时间格式)。如果GeoCouch在大于180.0
的范围内为您工作,并且为地理计算设计的浮点运算的精度足以满足精确度为秒的日期,您的问题就解决了:)我确信,只需很少的技巧和黑客,你就可以在地理软件中有效地解决这个问题。如果不是GeoCouch,那么也许ElastiSearch(也支持多维查询)很容易与CouchDB及其River插件系统一起使用。