Overview
このガイドでは、 Rubyドライバーを使用して、読み取り操作 によりMongoDBコレクションからデータを検索する方法を学習できます。コレクションで find
メソッドを呼び出して、基準のセットに一致するドキュメントを検索できます。
サンプル データ
このガイドの例では、 Atlasサンプルデータセット の sample_training
データベースの companies
コレクションを使用します。Rubyアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続する Mongo::Client
オブジェクトを作成し、次の値を database
変数と collection
変数に割り当てます。
database = client.use('sample_training') collection = database[:companies]
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 「Atlas を使い始める」ガイドを参照してください。
ドキュメントの検索
コレクションからドキュメントを検索するには、find
メソッドを使用します。このメソッドはクエリフィルターパラメーターを受け取り、クエリを表す Mongo::Collection::View
オブジェクトを返します。ドライバーは、first
や each
などのメソッドを使用して結果を取得するまで、クエリの実行を延期します。結果をリクエストと、ドライバーはクエリをサーバーに送信し、結果にアクセスできる Mongo::Cursor
オブジェクトを返します。
find
メソッドにオプション メソッドを連鎖させて、操作の結果を絞り込むことができます。
Tip
クエリフィルターの詳細については、「 クエリの指定」ガイドを参照してください。
複数ドキュメントの検索
コレクション内の複数のドキュメントを検索するには、検索するドキュメントの基準を指定するクエリフィルターを find
メソッドに渡します。
次の例では、 find
メソッドを使用して、 founded_year
フィールドの値が1970
であるすべてのドキュメントを検索します。
results = collection.find(founded_year: 1970)
クエリを表す Mongo::Collection::View
オブジェクトで each
メソッドを呼び出すと、ドライバーは Mongo::Cursor
オブジェクトを返します。カーソルは、アプリケーションがデータベースの結果を反復処理しながら、特定の時点でメモリ内に結果のサブセットのみを保持できるようにするメカニズムです。カーソルは、find
メソッドが大量のドキュメントを返す場合に便利です。
次のコードでは、each
メソッドを呼び出してクエリ結果を反復処理します。
results.each do |doc| puts doc end
{"_id"=>BSON::ObjectId('...'), "name"=>"Mitsubishi Motors", "permalink"=>"mitsubishi-motors", "crunchbase_url"=>"http://www.crunchbase.com/company/mitsubishi-motors", "homepage_url"=>"http://www.mitsubishi-motors.com", ...} {"_id"=>BSON::ObjectId('...'), "name"=>"Western Digital", "permalink"=>"western-digital", "crunchbase_url"=>"http://www.crunchbase.com/company/western-digital", "homepage_url"=>"http://www.wdc.com/en", ...} {"_id"=>BSON::ObjectId('...'), "name"=>"Celarayn", "permalink"=>"celarayn", "crunchbase_url"=>"http://www.crunchbase.com/company/celarayn", "homepage_url"=>"http://www.celarayn.es", ...}
注意
すべてのドキュメントの検索
コレクション内のすべてのドキュメントを検索するには、クエリフィルターを渡せずに find
メソッドを呼び出します。
results = collection.find
1 つのドキュメントの検索
コレクション内の 1 つのドキュメントを検索するには、find
メソッドを呼び出し、検索するドキュメントの基準を指定するクエリフィルターを渡します。 次に、first
メソッドを find
にチェーンします。
クエリフィルターが複数のドキュメントと一致する場合、first
メソッドは操作結果から最初に一致するドキュメントを検索します。
次の例では first
メソッドを find
に連鎖させて、name
フィールドの値が 'LinkedIn'
になっている最初のドキュメントを検索します。
document = collection.find(name: 'LinkedIn').first puts document
{"_id"=>BSON::ObjectId('...'), "name"=>"LinkedIn", "permalink"=>"linkedin", "crunchbase_url"=>"http://www.crunchbase.com/company/linkedin", "homepage_url"=>"http://linkedin.com", "blog_url"=>"http://blog.linkedin.com", ...}
検索動作の変更
操作結果を変更するには、オプション メソッドを find
メソッドに連鎖させることができます。次の表で、これらのオプションの一部について説明します。
オプション | 説明 |
---|---|
| The number of documents to return per batch. The default value is 101 .Type: Integer |
| The collation to use for the operation. The default value is the collation
specified for the collection. Type: Hash |
| The comment to attach to the operation. Type: Object |
| The maximum number of documents the operation can return. Type: Integer |
| The number of documents to skip before returning results. Type: Integer |
| The order in which the operation returns matching documents. Type: Hash |
次の例では、 find
メソッドを使用して、 number_of_employees
フィールドの値が1000
であるすべてのドキュメントを検索します。 この例ではlimit
オプションを使用して最大2
の結果が返されます。
limit_results = collection.find(number_of_employees: 1000).limit(2) limit_results.each do |doc| puts doc end
{"_id"=>BSON::ObjectId('...'), "name"=>"Akamai Technologies", "permalink"=>"akamai-technologies", "crunchbase_url"=>"http://www.crunchbase.com/company/akamai-technologies", "homepage_url"=>"http://www.akamai.com", ...} {"_id"=>BSON::ObjectId('...'), "name"=>"Yodle", "permalink"=>"yodle", "crunchbase_url"=>"http://www.crunchbase.com/company/yodle", "homepage_url"=>"http://www.yodle.com", ...}
オプションの完全なリストについては、find メソッドのAPIドキュメントを参照してください。
詳細情報
クエリフィルターの詳細については、「クエリの指定」ガイドを参照してください。
Rubyドライバーを使用してドキュメントを取得するコード例については、「 ドキュメントのクエリ 」を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。