Overview
このガイドでは、 .NET/ C#ドライバーを使用して、カーソルからデータにアクセスする方法を学習できます。
カーソルは、読み取り操作の結果を反復可能なバッチで返すツールです。カーソルは一度にドキュメントのサブセットのみを保持するため、メモリ消費とネットワーク帯域幅使用量の両方が削減されます。
FindSync() または FindAsync() メソッドを使用してカーソルを取得できます。また、ToCursor() または ToCursorAsync() メソッドを連結して、Find() メソッドの結果をカーソルに変換することもできます。
サンプル データ
このガイドの例では、 Atlasサンプルデータセットで提供されている sample_restaurantsデータベースの restaurantsコレクションを使用します。MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 .NET/ C#ドライバーを使い始める チュートリアルを参照してください。
このページの例では、次の Restaurantオブジェクトを使用して、 restaurantsコレクション内のドキュメントをモデル化します。
[] public class Restaurant { public ObjectId Id { get; set; } [] public string Name { get; set; } }
カーソルの内容に反復的にアクセスする
カーソルの内容を反復処理するには、using ブロック内で foreach ループを使用します。次の例では、restaurantsコレクションから nameフィールドの値が "Starbucks" であるドキュメントを検索し、その結果を反復処理します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Starbucks"); using (var cursor = collection.FindSync(filter)) { while (cursor.MoveNext()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Starbucks"); using (var cursor = await collection.FindAsync(filter)) { while (await cursor.MoveNextAsync()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
次の例では同じ操作を実行しますが、ToCursor() メソッドを使用します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Starbucks"); using (var cursor = collection.Find(filter).ToCursor()) { while (cursor.MoveNext()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Starbucks"); using (var cursor = await collection.Find(filter).ToCursorAsync()) { while (await cursor.MoveNextAsync()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
すべてのドキュメントを検索する
警告
クエリによって返されるドキュメントの数とサイズが利用可能なアプリケーションメモリを超えると、プログラムがクラッシュする可能性があります。大規模な結果セットが予想される場合は、カーソルに反復的にアクセスしてください。
カーソルからすべてのドキュメントを検索するには、次の例に示すように ToList() メソッドを使用します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Dunkin' Donuts"); var results = collection.FindSync(filter).ToList();
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Dunkin' Donuts"); var results = (await collection.FindAsync(filter)).ToList();
テール可能カーソル
Cappedコレクションをクエリする場合、クライアントがカーソルの結果を使い果たした後も開いたままになる追尾可能 (tailable) カーソルを使用できます。追尾可能 (tailable) カーソルを作成するには、FindOptionsオブジェクトを作成し、CursorTypeプロパティを CursorType.TailableAwait に設定します。次に、FindOptionsオブジェクトを検索操作メソッドの 1 つに渡します。次の例は、 Cappedコレクションに追尾可能 (tailable) カーソルを作成する方法を示しています。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Dunkin' Donuts"); var options = new FindOptions<Restaurant> { CursorType = CursorType.TailableAwait }; using (var cursor = collection.FindSync(filter, options)) { while (cursor.MoveNext()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
var filter = Builders<Restaurant>.Filter.Eq(r => r.Name, "Dunkin' Donuts"); var options = new FindOptions<Restaurant> { CursorType = CursorType.TailableAwait }; using (var cursor = await collection.FindAsync(filter, options)) { while (await cursor.MoveNext()) { foreach (var restaurant in cursor.Current) { Console.WriteLine(restaurant.Name); } } }
API ドキュメント
このガイドで使用されているメソッドとクラスの詳細については、次のAPIドキュメントを参照してください。