我正在使用CouchDB存储有关事件的数据。每个事件都有一个开始日期/时间和结束日期/时间。我想现在创建一个视图,它可以让我获得在特定日期/时间发生的所有事件的列表。但是这些事件并没有单一的日期,他们可以在几天内调整范围。CouchDB中的范围键视图
现在我不知道如何在我的视图功能中反映这一点。不幸的是,我需要精细的分级,所以每分钟发一个密钥可能不是一个有效的解决方案。那我该怎么做?
在此先感谢!
我正在使用CouchDB存储有关事件的数据。每个事件都有一个开始日期/时间和结束日期/时间。我想现在创建一个视图,它可以让我获得在特定日期/时间发生的所有事件的列表。但是这些事件并没有单一的日期,他们可以在几天内调整范围。CouchDB中的范围键视图
现在我不知道如何在我的视图功能中反映这一点。不幸的是,我需要精细的分级,所以每分钟发一个密钥可能不是一个有效的解决方案。那我该怎么做?
在此先感谢!
好的,无论如何,这是一个解决方案!我只是与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
}
}
那么它应该很容易与startkey
和endkey
查询。您可以在这里添加_list
。
感谢您的回答,但正如我在我的问题中所写的那样,“每分钟发一个键可能不是一个有效的解决方案”。这是因为我手上有很长的时间范围(即多天)。另一方面,我仍然需要一个很好的粒度。这只能通过每个文档发布数千个密钥来实现,据我所知,这并不能很好地扩展。但再次感谢您的想法。 – 2010-06-30 17:21:36
那么,视图会被计算一次,然后被读取。我不认为这应该是一个问题,但我明白你的意思。 – Till 2010-07-01 17:29:46
我发现最后用GeoCouch一个很好的解决方案:http://www.diretto.org/2010/08/efficient-time-based-range-queries-in-couchdb-using-geocouch/
这是正确的答案,但不幸的是,链接已经死亡。 – dgreisen 2015-03-08 13:41:25
来自文章: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
艰难的,我不认为范围查询CouchDB的拿手好戏。 – Till 2010-06-30 15:50:57