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

时间:2013-03-22 20:55:02

标签: couchdb

我有大量文件,每一份都有效。范围可以从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,一个星期前的日期我会得到这两份文件,并且明天的日期我将不会收到任何文件。

请注意,实际的分辨率需要降低到正在发出的请求的第二个,并且有很多文档,因此每个有效秒发出密钥的策略都不合适。

2 个答案:

答案 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=datestart_at<date)所限定的矩​​形中的点列表, bottom=date, top=infinityend_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插件系统一起使用。