Как создать индекс, возвращающий тип входного документа? - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть база данных Raven, которая содержит коллекцию документов.Я хотел бы получить подмножество документов в этой коллекции.Только документы, отвечающие определенным критериям, будут получены.Однако для каждого извлеченного документа необходимо извлечь весь документ.

Рассмотрим следующий тип документа:

public class MyDocument {
    public string Id { get; set; }

    public string Name { get; set; }
    public int Foo { get; set; }
    public string Bar { get; set; }
}

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

IList<MyDocument> FindMyDocuments(int minFooValue) {
    using(IDocumentSession session = _store.OpenSession()) {
        return session.Query<MyDocument>().Where(d => d.Foo > minFooValue).ToList();
    }
}

Однако, насколько я понимаю, есть преимущества использования предопределенных индексов вместо динамических индексов.Поэтому я хотел бы заранее определить индекс для этой операции. Как будет выглядеть реализация AbstractIndexCreationTask ?

Кажется, что следующее не работает, так как Raven хочет, чтобы Map выбрала новый анонимный тип:

class MyDocumentIndex: AbstractIndexCreationTask<MyDocument, MyDocument> {
    public MyDocumentIndex() {
        Map = docs => from doc from docs
                      select doc;
    }
}

А разве не должно быть и части «Уменьшить»?

Как вы, наверное, заметили, я довольно новичок в этой концепции карты / уменьшения: -).

1 Ответ

0 голосов
/ 15 декабря 2011

Давид, Вы делаете это так:

public class MyDocumentIndex: AbstractIndexCreationTask<MyDocument> {
    public MyDocumentIndex() {
        Map = docs => from doc from docs
                      select new { doc.Foo };
    }
}

И затем вы запрашиваете его с помощью:

session.Query<MyDocument, MyDocumentIndex().Query(x=>x.Foo > minValue).ToArray();
...