Overview
このガイドでは、 Rubyドライバーを使用して、プロジェクションを使用して読み取り操作から返されるフィールドを指定する方法を学習できます。プロジェクションは、 MongoDB がクエリから返すフィールドを指定するドキュメントです。
サンプル データ
このガイドの例では、 Atlasサンプルデータセット の sample_restaurantsデータベース内の restaurantsコレクションを使用します。Rubyアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続する Mongo::Clientオブジェクトを作成し、次の値を database 変数と collection 変数に割り当てます。
database = client.use('sample_restaurants') collection = database[:restaurants]
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 MongoDB を使い始めるガイドを 参照してください 。
プロジェクションのタイプ
プロジェクションを使用して、返されるドキュメントに含めるフィールドまたは除外するフィールドを指定できます。_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ドキュメントを参照してください。