2012-08-29 41 views
0

我在RavenDb文件可能看起來像這樣完整的序列:查找使用RavenDb指數

{ "Id": "obj/1", "Version": 1 }, 
{ "Id": "obj/1", "Version": 2 }, 
{ "Id": "obj/1", "Version": 3 }, 
{ "Id": "obj/1", "Version": 4 }, 
{ "Id": "obj/2", "Version": 1 }, 
{ "Id": "obj/2", "Version": 2 }, 
{ "Id": "obj/2", "Version": 3 }, 
{ "Id": "obj/3", "Version": 1 }, 
{ "Id": "obj/3", "Version": 3 } 

我試圖創建一個能夠給我一個指標:

  • 序列「obj/1」和「obj/2」,最好由Id分組。
  • 不是序列 「OBJ/3」,因爲其尚未完成

我將如何做到這一點?

+0

如何定義完成e序列?有順序ID? –

+0

1,2,3是完整的,而1,3有一個洞並且不完整。版本是一個順序計數器。這將用於事件處理器。我會在事件序列完成後執行。我正在挑選一個簡單的閱讀模型的東西。 –

回答

0

我設法解決它。我不確定這是否是最佳解決方案,但似乎可行。

class SequenceIndex : AbstractIndexCreationTask<MyObject> 
{ 
    public EventSequenceIndex() 
    { 
     Map = objects => from d in docs 
         orderby d.Version 
         select new 
         { 
          Id = d.Id, 
          Version = d.Version 
         }; 

     TransformResults = (database, results) => 
      from result in results 
      group result by result.Id into g 
      where g.Select(d => d.Version + 1) 
       .Except(g.Select(d => d.Version)) 
       .Count() == 1 
      select new 
      { 
       Id = g.Key, 
       Objects = g 
      }; 
    } 
} 

通過查詢:

var events = session.Query<MyObject, SequenceIndex>() 
    .As<MySequenceObjectView>() 
    .ToArray(); 

I組由編號的文件,然後採取所有version + 1除了所有version,這對於1, 2, 3原來的順序將是2, 3, 4 except 1, 2, 3,這給了我4(這是爲什麼我使用Count() == 1但是如果序列中有一個孔,則計數將大於1,因此排除在結果之外。