2013-12-13 25 views
0

的我有一些文件表示Jobs:基於這些我想要顯示事件的時間表在指定日期範圍RavenDB:正確使用多圖

{ 
    "name": "Job 1", 
    "startAt": "2013-12-13", 
    "endAt": "2013-12-15" 
}, 
{ 
    "name": "Job 2", 
    "startAt": "2013-12-14", 
    "endAt": "2013-12-16" 
} 

。而不是每個字段查詢和客戶端上的結果拼接在一起,我正打算創建一個索引返回是這樣的:

{"Results":[ 
    { 
     "name": "Job 1", 
     "timestamp": "2013-12-13", 
     "event": "started" 
    }, 
    { 
     "name": "Job 2", 
     "timestamp": "2013-12-14", 
     "event": "started" 
    }, 
    { 
     "name": "Job 1", 
     "timestamp": "2013-12-15", 
     "event": "ended" 
    }, 
    { 
     "name": "Job 2", 
     "timestamp": "2013-12-16", 
     "event": "ended" 
    } 
]} 

他們會爲工作其他一些「事件」隨着時間的推移,記錄付款到期時間等,這也會出現在時間表上 - 但希望這裏有足夠的細節來解釋我正在嘗試做什麼。

到目前爲止,我已經有了一個多地圖索引的工作,但從我的理解,多地圖是索引不同的文檔類型,而我只是一個。

public class Jobs_Timeline : AbstractMultiMapIndexCreationTask<Jobs_Timeline.IndexResult> 
{ 
    public Jobs_Timeline() 
    { 
     AddMap<Job>(jobs => jobs.Select(x => new { x.Name, Timestamp = x.StartAt, Event = "started" })); 
     AddMap<Job>(jobs => jobs.Select(x => new { x.Name, Timestamp = x.EndAt, Event = "ended" })); 

     Store(x => x.Name, FieldStorage.Yes);   
     Store(x => x.Timestamp, FieldStorage.Yes); 
     Store(x => x.Event, FieldStorage.Yes); 
    } 

    public class IndexResult 
    { 
     public string Name { get; set; } 
     public DateTime Timestamp { get; set; } 
     public string Event { get; set; } 
    } 
} 

我想知道的是:

  • 基於我想要的結果,我應該使用此索引(或結果變壓器,去歸一化文檔等)
  • 如果我應該使用索引,我是否應該使用多個地圖而不只是一種文檔類型?

Raven和NoSQL都是新手,所以我可能會用完全錯誤的方式來解決這個問題。

回答

0

這是一個完全可以接受的方法,我做了幾乎完全相同的事情。

我會改變的唯一事情就是讓事件更具描述性。

AddMap<Job>(jobs => from j in jobs 
        select new 
        { 
         x.Name, 
         Timestamp = x.EndAt, 
         Event = "ended", 
         EventType = "job" 
        }); 

添加事件類型,當你在將來添加多個事件,將允許您按類型來過濾事件。

顯示我的所有工作活動

顯示我的所有註冊活動

編輯:也以其優良的索引多次,你打破了同樣的文件將單個文檔分成多個事件。

+0

乾杯,它工作得很好,很高興知道這是正確的方式。我的事件實際上是一個枚舉,但是關於類型的好處,有助於稍後查詢。 –