Overview
このガイドでは、 Rubyドライバーを使用して、プロジェクションを使用して読み取り操作から返されるフィールドを指定する方法を学習できます。プロジェクションは、 MongoDB がクエリから返すフィールドを指定するドキュメントです。
サンプル データ
このガイドの例では、 Atlasサンプルデータセット の sample_restaurants
データベース内の restaurants
コレクションを使用します。Rubyアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続する Mongo::Client
オブジェクトを作成し、次の値を database
変数と collection
変数に割り当てます。
database = client.use('sample_restaurants') collection = database[:restaurants]
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 「Atlas を使い始める」ガイドを参照してください。
プロジェクションのタイプ
プロジェクションを使用して、返されるドキュメントに含めるフィールドまたは除外するフィールドを指定できます。_id
フィールドを除外している場合を除き、包含ステートメントと除外ステートメントを 1 つのプロジェクションに組み合わせることはできません。
含めるフィールドの指定
読み取り操作の結果に特定のフィールドを含めるには、find
メソッドのパラメーターで projection
オプションを指定します。このオプションを設定するには、次の構文を使用します。
{ projection: { <field_name>: 1 } }
次の例では、find
メソッドを使用して、name
フィールドの値が 'Emerald Pub'
であるすべてのレストランを検索します。次に、コードは projection
オプションを指定して、一致するドキュメントの name
、cuisine
、borough
フィールドのみを返すように検索操作に指示します。
opts = { projection: { name: 1, cuisine: 1, borough: 1 } } collection.find({ name: 'Emerald Pub' }, opts).each do |doc| puts doc end
{"_id"=>BSON::ObjectId('...'), "borough"=>"Manhattan", "cuisine"=>"American", "name"=>"Emerald Pub"} {"_id"=>BSON::ObjectId('...'), "borough"=>"Queens", "cuisine"=>"American", "name"=>"Emerald Pub"}
プロジェクションを使用して返されるドキュメントに含めるフィールドを指定すると、 _id
フィールドもデフォルトで含まれます。 他のすべてのフィールドは暗黙的に除外されます。 返されるドキュメントから_id
フィールドを削除するには、明示的に除外する必要があります。
フィールドを除外する_id
含めるフィールドを指定する場合は、返されるドキュメントから_id
フィールドを除外することもできます。
次の例では、前の例と同じクエリを実行しますが、プロジェクションから_id
フィールドを除外します。
opts = { projection: { name: 1, cuisine: 1, borough: 1, _id: 0 } } collection.find({ name: 'Emerald Pub' }, opts).each do |doc| puts doc end
{"borough"=>"Manhattan", "cuisine"=>"American", "name"=>"Emerald Pub"} {"borough"=>"Queens", "cuisine"=>"American", "name"=>"Emerald Pub"}
除外するフィールドの指定
読み取り操作結果から特定のフィールドを除外するには、find
メソッドのパラメーターで projection
オプションを指定します。このオプションを設定するには、次の構文を使用します。
{ projection: { <field_name>: 0 } }
次の例では、find
メソッドを使用して、name
フィールドの値が 'Emerald Pub'
であるすべてのレストランを検索します。次に、コードは projection
オプションを使用して、結果内の grades
フィールドと address
フィールドを省略するように検索操作に指示します。
opts = { projection: { grades: 0, address: 0 } } collection.find({ name: 'Emerald Pub' }, opts).each do |doc| puts doc end
{"_id"=>BSON::ObjectId('...'), "borough"=>"Manhattan", "cuisine"=>"American", "name"=>"Emerald Pub", "restaurant_id"=>"40367329"} {"_id"=>BSON::ObjectId('...'), "borough"=>"Queens", "cuisine"=>"American", "name"=>"Emerald Pub", "restaurant_id"=>"40668598"}
プロジェクションを使用して除外するフィールドを指定すると、指定されていないフィールドは返されるドキュメントに暗黙的に含まれます。
詳細情報
プロジェクションの詳細については、 MongoDB Serverマニュアルの「プロジェクト フィールド 」ガイドを参照してください。
API ドキュメント
find
メソッドの詳細については、APIドキュメントを参照してください。