RavenDB лучшая практика для «выбрать все»? - PullRequest
4 голосов
/ 30 марта 2012

У меня есть вопрос о том, как реализовать то же поведение «select * from xxx where ...» в RavenDB, учитывая, что будет возвращено огромное количество документов (индекс уже настроен).

Я слышал, что по умолчанию используется Take (128), верно? Но я хочу что-то вроде TakeAll (), потому что я не знаю фактическое число. Как добиться этого правильно?

Что я могу придумать, так это использовать Skip () и Take () до самого конца. Но это выглядит действительно утомительно для такого простого требования. Кроме того, он может превышать предел количества запросов для одного сеанса, что является еще одним барьером, который мне интересно, как изящно преодолеть.

Большое спасибо:)

Ответы [ 2 ]

5 голосов
/ 30 марта 2012

Додд, причина этого в том, что всегда плохая практика загружать все сразу, независимо от того, что вы пытаетесь сделать. Однако по умолчанию вы можете получить 1024 сразу, используя .Take (1024). Если вы действительно хотите увеличить этот лимит, вы можете изменить "Raven / MaxPageSize" в конфигурации сервера, которая по умолчанию равна 1024, но, опять же, вы вряд ли захотите это сделать.

1 голос
/ 05 апреля 2012

Додд, хотя я согласен с @Daniel, что не рекомендуется выбирать все , у вас все еще может быть хороший вариант использования.

EDIT:

Этот метод не будет работать, поскольку MaxPageSize все еще будет верхней границей (как отмечено @Ayende в комментариях ниже.

Вместо установки MaxPageSize или вызова Take() в итерации цикла вы можете выполнить два простых запроса для получения данных.

Первый запрос будет использоваться для определения СКОЛЬКО записей существует. Обратите внимание на Take(0), который не возвращает никаких результатов, но он заполнит статистику .

RavenQueryStatistics stats = null;
var tempPagingQuery = (from p in session.Query<Page>
                        .Statistics(out stats)
                       select p).Take(0).FirstOrDefault();

Второй запрос будет извлекать все записи. Здесь мы используем TotalResults из статистики , которая была собрана выше.

pages = (from p in session.Query<Page>
         select p).Take(stats.TotalResults).ToList();

...