Вопрос по – Правильный способ получения более 128 документов с RavenDB

26

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

Насколько я понимаю, можно получить больше документов, чем 128 по умолчанию, сделав это:

<code>session.Advanced.MaxNumberOfRequestsPerSession = int.MaxValue;
</code>

И я узнал, что предложение WHERE должно быть ExpressionTree вместо Func, чтобы оно обрабатывалось как Queryable, а не Enumerable. Поэтому я подумал, что это должно работать:

<code>public static List<T> GetObjectList<T>(Expression<Func<T, bool>> whereClause)
{
    using (IDocumentSession session = GetRavenSession())
    {
        return session.Query<T>().Where(whereClause).ToList();                
    }
}
</code>

Однако, это только возвращает 128 документов. Зачем

Обратите внимание, вот код, который вызывает вышеуказанный метод:

<code>RavenDataAccessComponent.GetObjectList<Ccm>(x => x.TimeStamp > lastReadTime);
</code>

Если я добавлю Take (n), я получу столько документов, сколько захочу. Например, это возвращает 200 документов:

<code>return session.Query<T>().Where(whereClause).Take(200).ToList();
</code>

Исходя из всего этого, может показаться, что правильный способ извлечения тысяч документов - установить MaxNumberOfRequestsPerSession и использовать Take () в запросе. Это правильно? Если нет, то какдолже это будет сделано?

Для моего приложения мне нужно получить тысячи документов (в которых очень мало данных). Мы храним эти документы в памяти и используем в качестве источника данных для диаграмм.

** РЕДАКТИРОВАТЬ *

Я пытался использовать int.MaxValue в своем Take ():

<code>return session.Query<T>().Where(whereClause).Take(int.MaxValue).ToList();
</code>

И это возвращает 1024. Мм. Как мне получить больше 1024?

** РЕДАКТИРОВАТЬ 2 - Образец документа с данными **

<code>{
  "Header_ID": 3525880,
  "Sub_ID": "120403261139",
  "TimeStamp": "2012-04-05T15:14:13.9870000",
  "Equipment_ID": "PBG11A-CCM",
  "AverageAbsorber1": "284.451",
  "AverageAbsorber2": "108.442",
  "AverageAbsorber3": "886.523",
  "AverageAbsorber4": "176.773"
}
</code>

Ваш Ответ

4   ответа
16

вы можете использовать его в паре с Skip (n), чтобы получить все

        var points = new List<T>();
        var nextGroupOfPoints = new List<T>();
        const int ElementTakeCount = 1024;
        int i = 0;
        int skipResults = 0;

        do
        {
            nextGroupOfPoints = session.Query<T>().Statistics(out stats).Where(whereClause).Skip(i * ElementTakeCount + skipResults).Take(ElementTakeCount).ToList();
            i++;
            skipResults += stats.SkippedResults;

            points = points.Concat(nextGroupOfPoints).ToList();
        }
        while (nextGroupOfPoints.Count == ElementTakeCount);

        return points;

RavenDB Paging

Этот метод намного лучше. Matt
Остерегайтесь ограничения на количество запросов к серверу. В соответствии с настройками Raven «безопасные по умолчанию», он будет выполнять до 30 циклов обращения к серверу, поэтому, если циклу требуется выполнить больше, он потерпит неудачу, потому что каждая итерация цикла - это другой запрос сервера. Mike Schenk
23

TheTake(n)ункция @ даст вам только 1024 по умолчанию. Однако вы можете изменить это значение по умолчанию вRaven.Server.exe.config:

<add key="Raven/MaxPageSize" value="5000"/>

Для получения дополнительной информации см .:http: //ravendb.net/docs/intro/safe-by-defaul

Спасибо, Майк. Я думаю, что это в конечном итоге будет принятым ответом, но я хотел бы посмотреть, если кто-то еще имеет другой взгляд на это в первую очередь. Bob Horn
36

что начиная с версии 2.5, RavenDB имеет «API неограниченных результатов», позволяющий осуществлять потоковую передачу. Пример из документации показывает, как это использовать:

var query = session.Query<User>("Users/ByActive").Where(x => x.Active);
using (var enumerator = session.Advanced.Stream(query))
{
    while (enumerator.MoveNext())
    {
        User activeUser = enumerator.Current.Document;
    }
}

Есть поддержка стандартных запросов RavenDB, запросов Lucence, а также есть асинхронная поддержка.

Документацию можно найтиВо. Вступительная статья блога Айенде может быть найденаВо.

+ 1 за совет. Благодарность Bob Horn
Помните, что при запросах с использованием Streaming API индекс уже должен существовать. Если вы выполняете запрос через обычный API сеанса, и соответствующий индекс не существует, динамический индекс будет создан. Но в потоковом API динамический индекс не создается, и сервер жалуется, что индекс не найден. Mike Schenk
Mike - это интересное поведение, похоже на ошибку. Вы обсуждали это в группе RavenDB? Sean Kearon
Вы можете использоватьStream<T>(startsWith) перегрузка, чтобы получить все документы в определенной коллекции; нет необходимости использовать запрос, если вам не нужно выполнять запрос. kamranicus
Может быть, приятно добавить, что вам не нужно указывать коллекцию и дать ей разобраться по соглашению session.Advanced.Stream(documentStore.Conventions.GetTypeTagName(typeof(User)))). Может быть полезно для репозиториев. Caramiriel
5

а не количество документов, полученных за один вызов. Сессии недолговечны, и ожидается, что по ним будет сделано мало звонков.

Если вы получаете более 10 штук из хранилища (даже меньше, чем по умолчанию 128) для потребления человеком, значит, что-то не так, или ваша проблема требует другого подхода, чем загрузка документов из хранилища данны

ндексирование @RavenDB довольно сложное. Хорошая статья об индексацииВо и граниВо.

Если вам нужно выполнить агрегирование данных, создайте индекс map / Reduce, который приведет к агрегированным данным, например :

Показатель

    from post in docs.Posts
    select new { post.Author, Count = 1 }

    from result in results
    group result by result.Author into g
    select new
    {
       Author = g.Key,
       Count = g.Sum(x=>x.Count)
    }

Query:

session.Query<AuthorPostStats>("Posts/ByUser/Count")(x=>x.Author)();
Так как бы вы решили эту проблему? Компания хочет видеть график, показывающий данные за последние 24 часа. Каждый документ является точкой данных, и за последние 24 часа их было 10 000. Как вы планируете это, не приводя все данные? Bob Horn
Я только что заметил, что «каждый документ является точкой данных». Можете ли вы показать пример этого документа? Petar Vučetin
Я думаю, что вы можете достичь этого, создав индексы или Фасеты Petar Vučetin

Похожие вопросы