2010-06-20 50 views
8

我正在使用CouchDB存储有关事件的数据。每个事件都有一个开始日期/时间和结束日期/时间。我想现在创建一个视图,它可以让我获得在特定日期/时间发生的所有事件的列表。但是这些事件并没有单一的日期,他们可以在几天内调整范围。CouchDB中的范围键视图

现在我不知道如何在我的视图功能中反映这一点。不幸的是,我需要精细的分级,所以每分钟发一个密钥可能不是一个有效的解决方案。那我该怎么做?

在此先感谢!

+0

艰难的,我不认为范围查询CouchDB的拿手好戏。 – Till 2010-06-30 15:50:57

回答

8

好的,无论如何,这是一个解决方案!我只是与CouchDB的Jan(Lehnardt)平起床来,他告诉我可以在地图中多次使用emit()。直到现在我还不知道的东西。

为了让自己更容易,我假设您的结束时间和开始时间已经是TIMESTAMP值。如果不是,则需要将其转换为地图或通常切换到它们。

我还会假设一个事件在一分钟内开始(例如16:51:00),而不是在16:51:23。在结束日期相同。

实例文档:

{ 
    "_id" : "super-random-id", 
    "name" : "event 1", 
    "start" : "TIMESTAMP", 
    "end" : "TIMESTAMP" 
} 

这里的地图:

function (doc) { 
    if (doc.start == undefined || doc.end == undefined) { 
     return; 
    } 
    var current = doc.start; 
    while (current <= doc.end) { 
     emit(current, doc.id); 
     current = current + 60; // increment by 1 minute 
    } 
} 

那么它应该很容易与startkeyendkey查询。您可以在这里添加_list

+1

感谢您的回答,但正如我在我的问题中所写的那样,“每分钟发一个键可能不是一个有效的解决方案”。这是因为我手上有很长的时间范围(即多天)。另一方面,我仍然需要一个很好的粒度。这只能通过每个文档发布数千个密钥来实现,据我所知,这并不能很好地扩展。但再次感谢您的想法。 – 2010-06-30 17:21:36

+0

那么,视图会被计算一次,然后被读取。我不认为这应该是一个问题,但我明白你的意思。 – Till 2010-07-01 17:29:46

4
+1

这是正确的答案,但不幸的是,链接已经死亡。 – dgreisen 2015-03-08 13:41:25

+0

来自文章:GeoCouch“允许使用边界框进行空间搜索... GeoCouch的空间索引预计GeoJSON条目(它也不受任何独特格式如WGS84的约束),因此我们将时间段作为边界框放置,值被忽略并设置为0,纬度值表示编码为时间戳的时间开始和结束点。因此,我们...有效地查询给定时间段内的所有条目。“ http://web.archive.org/web/20131121023735/http://www.diretto.org/2010/08/efficient-time-based-range-queries-in-couchdb-using-geocouch/ – dgreisen 2015-03-08 13:45:40