2013-12-13 22 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

干杯,它工作得很好,很高兴知道这是正确的方式。我的事件实际上是一个枚举,但是关于类型的好处,有助于稍后查询。 –