2

编辑. 这是对该问题的简化描述:我有活动

class Event { Id = 0, Dates = new DateTime[] {} }

例如,我需要查询某个日期范围内的所有事件(8 月 1 日至 10 月 20 日)。结果应列出此范围内按日期排序的唯一事件。像这样:

Event one   2012-08-04,2012-09-06,2012-09-10
Event two   2012-10-02
etc.

我需要能够分页此结果。而已。


我在使用 ravendb 的活动中遇到以下问题。我有一个包含日期数组的文档(代表一个事件),例如 2012-08-20、2012-08-21、2012-09-14、2013-01-05 等。

class Event { Dates = []; }

我有几个必须满足的标准:

  1. 我需要能够在某个日期范围内查询这些文档。例如,查找所有日期介于 8 月 1 日和 9 月 22 日之间或 10 月 1 日和 10 月 3 日之间的所有事件。

  2. 我必须能够按日期对查询进行排序

  3. 我必须能够对结果进行分页。

看起来很容易对吧?好吧,我有两种方法,但它们都失败了。

创建具有多个 from 的索引。像这样:

from event in docs.Events
from date in event.Dates
select new { Dates = date}

这有效并且易于查询。但是,由于skippedresults(索引将包含每个事件的重复项),它不能被分页。并且排序与分页结合也会失败。

…………………………………………………………………………

创建一个简单的索引

from event in docs.Events
select new { Dates = event.Dates }

这也有效,查询简单,也可以分页。但是无法排序。我需要按查询范围内的第一个可用日期对文档进行排序。

如果我不能解决这个问题,这对我们来说可能是一个交易破坏者......而且我真的不想开始使用新应用程序,除了我真的很喜欢 RavenDB..

4

3 回答 3

0

我对此的最终解决方案是创建两个索引。无论如何,我们的应用程序中都需要这两个索引,所以它没有任何开销。

以下索引用于查询和分页。Take() 和 Skip() 适用于此:

from event in docs.Events
from date in event.Dates
select new { Date = date}

但是,上面的索引没有返回正确的总点击数,这是创建寻呼机所需的。所以我们创建另一个索引:

from event in docs.Events
select new { Date = event.Dates }

现在我们可以使用 Statistics() 和 Take(0) 在上述索引上运行完全相同的查询(注意两个索引上的 Date 字段具有相同的名称),以仅获取命中数。

这样做的缺点显然是您需要运行两个查询,但我还没有找到解决方法。

于 2013-04-06T11:17:36.267 回答
0

我有一个类似的要求(重复事件),增加了日期的数量是高度可变的(可能从 1 到数百)并且可能与场地相关联。

在陷入类似僵局后,我最终将事件日期存储在 EventOccurrence 中:

public class EventOccurrence {   
   public string EventId {get; set;}   
   public DateTime Start {get; set;}   
   public string VenueId {get; set;} 
}

它易于查询和排序,并且使用 Session.Include 在出现时我们仍然保留查询性能。

这似乎是对关系模型的回归,但考虑到我们的限制,这是正确的选择。

于 2012-08-17T20:23:41.473 回答
0

您是说“简单索引”方法除了排序之外有效吗?

from event in docs.Events
select new
{
  Dates = event.Dates,
  FirstDate = event.Dates.First()
}

然后您可以按 FirstDate 排序。您无法对已分析或标记化的字段进行排序。

于 2012-08-28T15:11:27.003 回答