2016-10-19 1 views
0

大量のデータをクエリする必要があるというタスクがあります。このリストは非常に大きいです100000の値が含まれますクエリメソッドはカーソルまたはリストを返す必要がありますか? (Mongo DB C#)

List<Cell> cells = MyDatabaseService.Query(filter, sort, 100000); 

:mainメソッドでは

public List<T> Query(FilterDefinition<T> filter, SortDefinition<T> sort, int limit) 
{ 
    var query = Collection.Find(filter).Sort(sort).Limit(limit); 
    var result = query.ToList(); 
    return result; 
} 

:私は、クエリのメソッドを作成しました。

Iも使用することができる一方、メインで

public async Task<IAsyncCursor<T>> QueryAsync(FilterDefinition<T> filter, SortDefinition<T> sort, int limit) 
{ 
    FindOptions<T> options = new FindOptions<T> { Sort = sort, Limit = limit }; 
    var queryCursor = await Collection.FindAsync(filter, options); 
    return queryCursor; 
} 

、私はカーソルを反復するwhileループを使用します。

Task<IAsyncCursor<Cell>> cursor = MyDatabaseService.QueryAsync(filter, sort, 100000); 
while (await cursor.MoveNextAsync()) 
{ 
    var batch = queryCursor.Current; 
    foreach (var document in batch) 
    { 

    } 
} 

私は多くのデータを照会することを考慮して、2番目の実装を使用することをお勧めしますか?返信いただきありがとうございます。

答えて

1

ドキュメントをサーバから取得した後は、実際にドキュメントで何を行うかによって異なります。

すべてのドキュメントがプログラムのメモリに格納されている必要がある操作を実行する必要がある場合、2つの方法は基本的に同じことを行います。

一方、返されたドキュメントを1つずつ使用している場合は、2番目の方法が優れています。最初のドキュメントはすべてのドキュメントを2回処理します(一度は他のすべてのドキュメントと一緒に取得し、 ); 2回目はそれを一度処理します(即座に検索して行動します)。

+0

これを実行すると、リストに保存されますか?また、最初のメソッドはスレッドをブロックしますか? –

+0

私はあなたがそれらを取得した後、あなたがドキュメントで何をしているのか分からないので、それを表現したり、それらに再度質問したりすることになるので、スレッドブロッキングに関しては、 'IFindFluent'に' ToListAsync'メソッドがあります。これはスレッドのブロックを停止します –

関連する問題