2013-12-13 1 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; } 
    } 
} 

То, что я хочу знать:

  • Основываясь на результатах, я хочу, я должен использовать индекс для этого (или трансформатор результатов, denormalised документов и т.д.)
  • Если я должен использовать индекс, должен ли я использовать мульти-карту только для одного типа документа?

Новое как для Ворона, так и для NoSQL, поэтому я, возможно, ошибаюсь в этом.

ответ

0

Это вполне приемлемый подход, и я сделал что-то почти идентичное.

Единственное, что я бы изменил, - сделать события более наглядными.

т.е.

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

Добавление типа событий, при добавлении нескольких событий в будущем, позволит фильтровать события по типу.

т.е.

Показать все Вакансии События

Показать все Регистрация События

т.д.

Edit: Кроме того, его штраф индексировать те же документы несколько раз, вы нарушаете один документ на несколько событий.

+0

Cheers, он работал достаточно хорошо, просто приятно знать, что это правильный путь. Мое событие на самом деле является перечислением, но хорошим моментом в отношении типа, полезным для последующего запроса. –

Смежные вопросы