Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Ruby ドライバー
/

カーソルからデータにアクセスする

このガイドでは、 Rubyドライバーを使用してカーソルからデータにアクセスする方法を学習できます。

カーソルは、読み取り操作の結果を反復可能なバッチで返すメカニズムです。 カーソルは一度にドキュメントのサブセットのみを保持するため、メモリ消費とドライバーがサーバーに送信するリクエスト数の両方を削減します。

アプリケーションコードから Mongo::Cursorクラスに直接アクセスすることはできません。Rubyドライバーを使用して 読み取り操作を実行すると、ドライバーはクエリを表す Mongo::Collection::Viewオブジェクトを返します。Collection::Viewオブジェクトからクエリ結果をリクエストと、ドライバーはこれらの結果を Cursorオブジェクトに内部的に保存します。次に、Collection::ViewCursorクラスによってサポートされる 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ドキュメントを参照してください。

戻る

ドキュメントをカウント

項目一覧