27

この質問のバリエーションが以前に(私によってさえ)尋ねられたことは知っていますが、これについてはまだ1つか2つ理解していません...

これを行うことで、128のデフォルト設定よりも多くのドキュメントを取得できることが私の理解でした:

session.Advanced.MaxNumberOfRequestsPerSession = int.MaxValue;

また、WHERE 句は Func ではなく ExpressionTree にする必要があることを学びました。これにより、Enumerable ではなく Queryable として扱われます。だから私はこれがうまくいくはずだと思った:

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

ただし、それでは 128 個のドキュメントしか返されません。なんで?

上記のメソッドを呼び出すコードは次のとおりです。

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

Take(n) を追加すると、好きなだけドキュメントを取得できます。たとえば、これは 200 個のドキュメントを返します。

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

これらすべてに基づくと、何千ものドキュメントを取得する適切な方法は、MaxNumberOfRequestsPerSession を設定し、クエリで Take() を使用することです。そうですか?そうでない場合は、どのように行う必要がありますか?

私のアプリでは、何千ものドキュメント (データがほとんど含まれていない) を取得する必要があります。これらのドキュメントはメモリに保持され、グラフのデータ ソースとして使用されます。

** 編集 **

Take() で int.MaxValue を使用してみました:

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

そして、それは 1024 を返します。どうすれば 1024 を超えることができますか?

** 編集 2 - データを示すサンプル ドキュメント **

{
  "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"
}
4

5 に答える 5

25

このTake(n)関数は、デフォルトで最大 1024 までしか提供しません。Raven.Server.exe.configただし、このデフォルトは次のように変更できます。

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

詳細については、http: //ravendb.net/docs/intro/safe-by-defaultを参照してください。

于 2012-04-06T21:02:43.690 に答える
16

Take(n) 関数は、デフォルトで最大 1024 までしか提供しません。ただし、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 ページング

于 2012-07-16T20:58:14.273 に答える
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)
    }

クエリ:

session.Query<AuthorPostStats>("Posts/ByUser/Count")(x=>x.Author)();
于 2012-04-07T00:55:09.800 に答える
1

メソッドで定義済みのインデックスを使用することもできますStream。インデックス付きフィールドで Where 句を使用できます。

var query = session.Query<User, MyUserIndex>();
var query = session.Query<User, MyUserIndex>().Where(x => !x.IsDeleted);

using (var enumerator = session.Advanced.Stream<User>(query))
{
    while (enumerator.MoveNext())
    {
        var user = enumerator.Current.Document;
        // do something
    }
}

索引の例:

public class MyUserIndex: AbstractIndexCreationTask<User>
{
    public MyUserIndex()
    {
        this.Map = users =>
            from u in users
            select new
            {
                u.IsDeleted,
                u.Username,
            };
    }
}

ドキュメンテーション:インデックスとは? セッション : クエリ : クエリ結果をストリーミングするには?


重要な注意:Streamメソッドはオブジェクトを追跡しません。このメソッドから取得したオブジェクトを変更SaveChanges()しても、変更は認識されません。


その他の注意: 使用するインデックスを指定しないと、次の例外が発生する場合があります。

InvalidOperationException: StreamQuery は動的インデックスのクエリをサポートしていません。大規模なデータセットで使用するように設計されており、Query() のように 15 秒のインデックス作成後にすべてのデータセットを返すことはまずありません。

于 2016-03-09T18:40:03.380 に答える