如何获取在给定日期有效的所有CouchDB文档的列表?

如何获取在给定日期有效的所有CouchDB文档的列表?,couchdb,Couchdb,我收集了大量的文件,每个文件的有效期为几天。范围从1周到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周到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);
}
我该怎么做

例如,我有以下两个文档:

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,如果是1周前的日期,我会收到两份文件,如果是明天的日期,我将不会收到任何文件


请注意,实际解决方案需要精确到发出请求的第二秒,并且有很多文档,因此为每一有效秒发出一个密钥的策略并不合适。

您可以为您的范围内的每一天调用emit,然后您就可以轻松地挑选特定日期可用的文档

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);
}
功能(doc){
var日=新日期(单据开始),
end=新日期(doc.end).getTime();
做{
排放(天);
day=新日期(day.getFullYear()、day.getMonth()、day.getDate()+1);

}while(day.getTime()您可以将问题转化为位置的计算几何问题。对于二维平面中的文档
[x,y]=[start\u at,end\u at]
查询在日期有效的文档
date
是矩形中的点列表,边界为:
左=-无限,右=日期
开始日期

不幸的是,CouchDB团队低估了计算几何的能力,不支持多维查询。Geocooch扩展允许您轻松完成此类查询:

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.0180.0]/[-90.0,90.0]
,并且至少需要
int
(UNIX时间格式)。如果GeoCoach在大于
180.0
的范围内为您工作,并且为地理计算设计的浮点运算精度足以满足精度为秒的日期,则您的问题已解决:)我相信,通过一些技巧和黑客,你可以在geo软件中有效地解决这个问题。如果不是GeoCoach,那么也许ElastiSearch(也支持多维查询)这很容易与CouchDB及其River插件系统一起使用。

获取给定日期的所有有效文档可能是一个足够小的集合,可以在客户端上处理,然后确定哪些仍然有效。虽然平均每个文档需要180次发射…我想避免添加任何额外的技术我会至少对它进行一次基准测试,看看你是否真的遇到了任何问题,我以前听说过一些非常大的视图。如果你使用周数,你可以使用大约1/7的磁盘空间,或者在缩小周数后使用
\u list
函数来完成筛选。I h我已将此标记为答案,因为这是一个很好的解决方案。尽管我还没有使用它。我所做的是使用一个视图,其中包含结束时间的地图和一个列表,该列表将其过滤到只有有效开始日期的视图。不过感谢您的建议。我宁愿不引入其他技术。在is case并不重要,因为我只需要对文档是否有效进行布尔检查。