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. 結果をページングできる必要があります。

簡単そうですね。これには2つのアプローチがありますが、どちらも失敗します。

複数のfromでインデックスを作成します。そのようです:

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

これは機能し、クエリが簡単です。ただし、結果がスキップされたため、ページングできません(インデックスには各イベントの重複が含まれます)。また、ページングと組み合わせてソートも失敗します。

..............。

簡単なインデックスを作成する

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

これも機能し、クエリも簡単です。ページングすることもできます。ただし、並べ替えることはできません。クエリされた範囲内で最初に利用可能な日付でドキュメントを並べ替える必要があります。

私がこれを解決できない場合、それはおそらく私たちにとって取引のブレーカーになるでしょう..そして私は本当にRavenDBが好きである以外に、新しいアプリケーションを使い始めたくありません。

4

3 に答える 3

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 に答える
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フィールドの名前が同じであることに注意してください)、ヒット数のみを取得できます。

これの欠点は、明らかに2つのクエリを実行する必要があることですが、それを回避する方法が見つかりません。

于 2013-04-06T11:17:36.267 に答える