RavenDb: объединить данные с индексом - PullRequest
4 голосов
/ 28 марта 2012

В моей базе данных есть список дел:

{ Id: 1, Owner: "guid1", Text: "Question1" }
{ Id: 2, Owner: "guid1", Text: "Question2" }
{ Id: 3, Owner: "guid2", Text: "Question3" }

При запросе данных я также хотел бы иметь (в моем индексе, результате) количество дел, которые есть у каждого владельца. Итак, я создал карту / уменьшить индекс для этой коллекции:

public class RelatedCases
{
    public Guid Owner { get; set; }
    public int Count { get; set; }
}

public class RelatedCaseIndex : AbstractMultiMapIndexCreationTask<RelatedCases>
{
    public RelatedCaseIndex()
    {
        AddMap<CaseDocument> (c => c.Select(a => new { a.Owner, Count = 1 }));

        Reduce = result => result
            .GroupBy(a => a.Owner)
            .Select(a => new 
            { 
                Owner = a.Key, 
                Count = a.Sum(b => b.Count)
            });
    }
}

Теперь я просто не знаю, как создать запрос для включения данных из индекса. На основании документации я попробовал что-то вроде:

session.Query<CaseDocument>().Customize(a => a.Include ...)

или TransformResults для CaseIndex, которые не сработали должным образом.

Я знаю, что мог бы просто запросить ворона, чтобы получить список всех связанных случаев в отдельном запросе, но я бы хотел сделать это за один раз.

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Вы не можете запрашивать дела и объединять результат с индексом карты / уменьшения на лету. Это не совсем так, потому что каждый запрос будет работать с индексом, поэтому вы действительно запрашиваете объединение двух индексов. Это то, что вам нужно сделать заранее.

Другими словами - поместите всю информацию, к которой вы хотите обратиться, в вашу карту / уменьшите индекс. Затем вы можете выполнить запрос по этому индексу и .Include () документов, которые вас также интересуют.

0 голосов
/ 28 марта 2012

Не думаю, что вам нужен индекс MultiMap, для этого будет достаточно простого индекса MapReduce.

Затем вы можете запросить его так:

session.Query<RelatedCases, RelatedCaseIndex>();

Это вернет список связанных дел с владельцем и количеством.

...