Overview
このガイドでは、 Rubyドライバーを使用してカーソルからデータにアクセスする方法を学習できます。
カーソルは、読み取り操作の結果を反復可能なバッチで返すメカニズムです。 カーソルは一度にドキュメントのサブセットのみを保持するため、メモリ消費とドライバーがサーバーに送信するリクエスト数の両方を削減します。
アプリケーションコードから Mongo::Cursor
クラスに直接アクセスすることはできません。Rubyドライバーを使用して 読み取り操作を実行すると、ドライバーはクエリを表す Mongo::Collection::View
オブジェクトを返します。Collection::View
オブジェクトからクエリ結果をリクエストと、ドライバーはこれらの結果を Cursor
オブジェクトに内部的に保存します。次に、Collection::View
は Cursor
クラスによってサポートされる Enumerable
インターフェースを公開し、そこから結果にアクセスできます。
サンプル データ
このガイドの例では、 Atlasサンプルデータセット の sample_restaurants
データベースの restaurants
コレクションを使用します。Rubyアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続する Mongo::Client
オブジェクトを作成し、次の値を database
変数と collection
変数に割り当てます。
database = client.use('sample_restaurants') collection = database[:restaurants]
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 「Atlas を使い始める」ガイドを参照してください。
カーソルの内容に反復的にアクセスする
カーソルの内容を反復処理するには、 読み取り操作によって返された Mongo::Collection::View
オブジェクトで each
メソッドを呼び出します。これはドライバーに操作を実行し、Mongo::Cursor
に保存されている各結果を返すように指示します。
次の例では、find
メソッドを使用して、name
フィールドの値が "Dunkin' Donuts"
であるすべてのドキュメントを検索します。次に、カーソルに保存されている各ドキュメントを出力します。
cursor = collection.find(name: "Dunkin' Donuts") cursor.each do |doc| puts doc end
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40363098"} {"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40379573"} {"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40392410"} ...
ドキュメントを個別に検索する
カーソルからドキュメントを個別に検索するには、 読み取り操作によって返された Mongo::Collection::View
オブジェクトで first
メソッドを呼び出します。
次の例では、name
の値が "Dunkin' Donuts"
であるコレクション内のすべてのドキュメントを検索します。次に、first
メソッドを呼び出してカーソルの最初のドキュメントを出力します。
cursor = collection.find(name: "Dunkin' Donuts") first_doc = cursor.first puts first_doc
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40363098"}
すべてのドキュメントを検索する
警告
クエリによって返されたドキュメントの数とサイズが利用可能なアプリケーション メモリを超えると、プログラムはクラッシュします。 大規模な結果セットが予想される場合は、カーソルに反復的にアクセスしてください。
カーソルからすべてのドキュメントを検索するには、対応する Mongo::Collection::View
オブジェクトで to_a
メソッドを使用してカーソルを配列に変換します。
次の例では、to_a
メソッドを呼び出して、カーソルの結果を配列に保存します。
cursor = collection.find(name: "Dunkin' Donuts") array_results = cursor.to_a
テール可能カーソル
Cappedコレクションをクエリする場合、クライアントがカーソルの結果を使い果たした後も開いたままになる追尾可能 (tailable) カーソルを使用できます。追尾可能 (tailable) カーソルを作成するには、cursor_type
オプションを find
メソッドに渡します。このオプションは :tailable
に設定します。
例、次のコードに示すように、vegetables
というCappedコレクションを作成できます。
db = client.use('db') collection = db[:vegetables, capped: true, size: 1024 * 1024] collection.create vegetables = [ { name: 'cauliflower' }, { name: 'zucchini' } ] collection.insert_many(vegetables)
次に、次のコードを使用して vegetables
コレクション内のすべてのドキュメントを取得し、その結果を追尾可能 (tailable) カーソルに保存します。カーソルが使い果たされた後も、次の 3 つのドキュメントを検索するまで開いたままになります。
cursor = collection.find({}, cursor_type: :tailable) docs_found = 0 cursor.each do |doc| puts doc docs_found += 1 break if docs_found >= 3 end
{"_id"=>BSON::ObjectId('...'), "name"=>"cauliflower"} {"_id"=>BSON::ObjectId('...'), "name"=>"zucchini"}
vegetables
コレクションに別のドキュメントを挿入すると、上記のコードは新しいドキュメントを出力し、カーソルからそれ以上の結果は検索されません。
追尾可能 (tailable) カーソルの詳細については、 MongoDB Serverマニュアルの「追尾可能(tailable) カーソル 」を参照してください。
API ドキュメント
このガイドで説明されている関数の詳細については、次のAPIドキュメントを参照してください。