0

我有大量文件,每个文件的有效期为几天。范围可以从 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,而在 1 周前的日期,我会得到两份文件,而在明天的日期,我将不会收到任何文件。

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

4

2 回答 2

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);
}

即使您将有很多文档,如果您省略了发出的值部分(第二个参数),索引将尽可能小。

如果您需要更复杂,可以尝试couchdb-lucene。您可以将日期字段索引为日期对象,并在 1 个请求中使用多个字段执行范围查询。

于 2013-03-22T22:14:58.623 回答
0

您可以将问题转化为位置的计算几何问题。对于二维平面中的文档,[x,y]=[start_at,end_at]在日期有效的文档是由( ) 和( )date包围的矩形中的点列表。left=-infinity, right=datestart_at<datebottom=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(也支持多维查询),它很容易与带有 River 插件系统的 CouchDB 一起使用。

于 2013-03-23T12:35:37.220 回答