Overview
このガイドでは、 Lambda MongoDBを使用してMongoDBコレクションからデータを検索する方法を学びます。このガイドでは、データを検索するために使用できる Eloqueent モデル メソッドについて説明し、さまざまなタイプの検索操作の例を示します。
Laravel 統合の Eloquent モデルの詳細について詳しくは、データのモデル化セクションを参照してください。
始める前に
このガイドのコード例を実行するには、「クイック スタート 」チュートリアルを完了してください。 このチュートリアルでは、サンプル データを使用して MongoDB Atlas インスタンスを設定し、Lambda ウェブ アプリケーションで次のファイルを作成する手順を説明します。
Movie.phpファイル(moviesコレクション内のドキュメントを表すMovieモデルを含む)MovieController.phpファイル(データベース操作を実行するためのshow()関数を含む)browse_movies.blade.phpデータベース操作の結果を表示するための HTML コードを含む ファイル
次のセクションでは、Laravel アプリケーション内のファイルを編集して検索操作コード例を実行し、期待される出力を表示する方法について説明します。
クエリに一致するドキュメントの取得
Lambda の Eloqueent オブジェクト関係マッパー(ORM)を使用して、MongoDB コレクションを表すモデルを作成し、その上でクエリ条件を指定するためにメソッドを連鎖させることができます。
一連の条件に一致するドキュメントを検索するには、コレクションの対応する Eloqueent モデルでwhere()メソッドを呼び出し、クエリフィルターを メソッドに渡します。
Tip
Retrieve One Document
where() メソッドは、一致するすべてのドキュメントを検索します。最初に一致するドキュメントを取得するには、first() メソッドを連鎖させることができます。詳細と例の表示については、このガイドの「最初の結果の取得」セクションを参照してください。
クエリフィルターは、フィールド値の要件を指定し、これらの要件を満たすドキュメントのみを返すように検索操作に指示します。
クエリを構築するには、次のwhere()メソッド呼び出しのいずれかを使用できます。
where('<field name>', <value>)ターゲット フィールドが正確に指定された値を持つドキュメントに一致するクエリを構築しますwhere('<field name>', '<comparison operator>', <value>)ターゲット フィールドの値が比較条件を満たすドキュメントに一致するクエリを構築します
検索操作に複数の条件セットを適用するには、一連のwhere()メソッドを連鎖させることができます。
where()メソッドを使用してクエリを作成したら、 get()メソッドを連鎖させてクエリ結果を検索します。
この例では、 Movie Elastic モデルで 2 つのwhere()メソッドを呼び出して、次の条件を満たすドキュメントを検索します。
yearフィールドの値は2010imdb.ratingネストされたフィールドの値が より大きい8.5
クエリを指定するには、次の構文を使用します。
$movies = Movie::where('year', 2010) ->where('imdb.rating', '>', 8.5) ->get();
browse_moviesビューでクエリ結果を表示するには、 MovieController.phpファイルのshow()関数を次のコードのように編集します。
class MovieController { public function show() { $movies = Movie::where('year', 2010) ->where('imdb.rating', '>', 8.5) ->get(); return view('browse_movies', [ 'movies' => $movies ]); } }
Elastic ORM の代わりに Lambda クエリ ビルダを使用してクエリを実行する方法については、「クエリ ビルダ」ページを参照してください。
配列フィールド要素の一致
ドキュメントを検索するときに、配列フィールド要素を照合するためにクエリフィルターを指定できます。 ドキュメントに配列フィールドが含まれている場合、その値に指定された配列要素のすべてまたは一部が含まれているかどうかに基づいて、ドキュメントを照合できます。
次のwhere()メソッド呼び出しのいずれかを使用して、配列フィールドでクエリを構築できます。
where('<array field>', <array>)配列フィールド値が指定された配列と完全に一致するドキュメントに一致するクエリを構築しますwhere('<array field>', 'in', <array>)配列フィールド値に指定された配列要素が 1 つ以上含まれているドキュメントに一致するクエリを構築します
where()メソッドを使用してクエリを作成したら、 get()メソッドを連鎖させてクエリ結果を検索します。
Exact Array Match次のElement Match [ タブと タブから選択して、各パターンのクエリ構文を表示します。
この例では、 countries配列が正確に['Indonesia', 'Canada']であるドキュメントを検索します。
$movies = Movie::where('countries', ['Indonesia', 'Canada']) ->get();
この例では、 countries配列に配列['Canada', 'Egypt']の値の 1 つが含まれているドキュメントを検索します。
$movies = Movie::where('countries', 'in', ['Canada', 'Egypt']) ->get();
Eloquet ORM の代わりに Lambda クエリ ビルダを使用して配列フィールドをクエリする方法については、 クエリ ビルダ ガイドの「配列要素の一致」セクションを参照してください。
最初の結果を取得
一連の条件に一致する最初のドキュメントを取得するには、 where()メソッドとそれに続くfirst()メソッドを使用します。
一意の値をクエリするときに一貫した結果が得られるように、 orderBy()メソッドをfirst()にチェーンします。 orderBy()メソッドを省略すると、MongoDB はドキュメントの自然な順序に従って、またはコレクションに表示されるように、一致するドキュメントを返します。
この例では、 runtimeフィールドの値が30であるドキュメントをクエリし、 _idフィールドの値に従って最初に一致するドキュメントを返します。
クエリを指定するには、次の構文を使用します。
$movie = Movie::where('runtime', 30) ->orderBy('_id') ->first();
browse_moviesビューでクエリ結果を表示するには、 MovieController.phpファイルのshow()関数を次のコードのように編集します。
class MovieController { public function show() { $movie = Movie::where('runtime', 30) ->orderBy('_id') ->first(); return view('browse_movies', [ 'movies' => $movie ]); } }
Tip
orderBy()メソッドの詳細については、「 クエリ結果の変更 」ガイドの「 クエリ結果のソート 」セクションを参照してください。
コレクション内のすべてのドキュメントを取得
クエリフィルターを省略すると、コレクション内のすべてのドキュメントを検索できます。 ドキュメントを返すには、コレクションを表す Elowent モデルでget()メソッドを呼び出します。 あるいは、 get()メソッドのエイリアスall()を使用して同じ操作を実行することもできます。
すべてのドキュメントに一致する検索操作を実行するには、次の構文を使用します。
$movies = Movie::get();
完全に実行可能な例
以下のセクションでは、Laravel Integration を使用してドキュメントを検索する方法を説明する完全に実行可能なコード例を示しています。これらの例では、Atlas サンプル データセットの sample_mflix.movies コレクションを使用します。
Tip
使用例は、自身の Laravel アプリケーションか、スタートガイドチュートリアルで作成された my-app アプリケーションから実行できます。使用例では、このチュートリアルで作成された Movie.php モデル クラスを使用して、 movies MongoDB コレクションに対する操作を示します。操作を実行するには、サンプル コードを Laravel アプリケーションのコントローラー エンドポイントにコピーできます。
操作の期待される出力を表示するには、コントローラー関数を呼び出し、その結果をウェブ インターフェイスに返すウェブ ルートをアプリケーションに追加します。
ドキュメントの検索
対応するそれぞれのクエリ構文の例を表示するには、次の Eloquent タブと Query Builder タブから選択します。
この例では、次のアクションを実行します。
MovieEloent モデルを使用して、sample_mflixデータベース内のmoviesコレクションを表しますクエリフィルターに一致するドキュメントを
moviesコレクションから取得します検索されたドキュメントを印刷
この例では、 Movieモデルで次のメソッドを呼び出します。
where():directorsフィールドの値に"Rob Reiner"が含まれるドキュメントと一致しますorderBy(): 一致したドキュメントを_id値の昇順で並べ替えますfirst(): 最初に一致するドキュメントのみを検索
$movie = Movie::where('directors', 'Rob Reiner') ->orderBy('id') ->first(); echo $movie->toJson();
この例では、次のアクションを実行します。
DBファサードからtable()メソッドを呼び出してmoviesコレクションにアクセスしますクエリフィルターに一致するドキュメントを
moviesコレクションから取得します検索されたドキュメントの
titleフィールドを出力します
この例では、次のクエリ ビルダのメソッドを呼び出します。
where():directorsフィールドの値に"Rob Reiner"が含まれるドキュメントと一致しますorderBy(): 一致したドキュメントを_id値の昇順で並べ替えますfirst(): 最初に一致するドキュメントのみを検索
$movie = DB::table('movies') ->where('directors', 'Rob Reiner') ->orderBy('_id') ->first(); echo $movie->title;
複数ドキュメントの検索
対応するそれぞれのクエリ構文の例を表示するには、次の Eloquent タブと Query Builder タブから選択します。
この例では、次のアクションを実行します。
MovieEloent モデルを使用して、sample_mflixデータベース内のmoviesコレクションを表しますクエリフィルターに一致するドキュメントを
moviesコレクションから検索して印刷します
この例では、 Movieモデルで次のメソッドを呼び出します。
where():runtimeフィールドの値が900より大きいドキュメントに一致しますorderBy(): 一致したドキュメントを_id値の昇順で並べ替えますget(): クエリ結果を Lambdaコレクションオブジェクトとして取得します
$movies = Movie::where('runtime', '>', 900) ->orderBy('id') ->get();
この例では、次のアクションを実行します。
DBファサードからtable()メソッドを呼び出してmoviesコレクションにアクセスしますクエリフィルターに一致するドキュメントを
moviesコレクションから検索して印刷します
この例では、次のクエリ ビルダのメソッドを呼び出します。
where():runtimeフィールドの値が900より大きいドキュメントに一致しますorderBy(): 一致したドキュメントを_id値の昇順で並べ替えますget(): クエリ結果を Lambdaコレクションオブジェクトとして取得します
$movies = DB::table('movies') ->where('runtime', '>', 900) ->orderBy('_id') ->get();
ドキュメントをカウント
対応するそれぞれのクエリ構文の例を表示するには、次の Eloquent タブと Query Builder タブから選択します。
この例では、次のアクションを実行します。
MovieEloent モデルを使用して、sample_mflixデータベース内のmoviesコレクションを表しますクエリフィルターに一致する
moviesコレクションからカウントする一致するドキュメント数を出力
この例では、 Movieモデルで次のメソッドを呼び出します。
where():genresフィールドの値に"Biography"が含まれるドキュメントと一致しますcount(): 一致するドキュメントの数をカウントし、その数を整数として返します
$count = Movie::where('genres', 'Biography') ->count(); echo 'Number of documents: ' . $count;
この例では、次のアクションを実行します。
DBファサードからtable()メソッドを呼び出してmoviesコレクションにアクセスしますクエリフィルターに一致する
moviesコレクションからカウントする一致するドキュメント数を出力
この例では、次のクエリ ビルダのメソッドを呼び出します。
where():genresフィールドの値に"Biography"が含まれるドキュメントと一致しますcount(): 一致するドキュメントの数をカウントし、その数を整数として返します
$count = DB::table('movies') ->where('genres', 'Biography') ->count(); echo 'Number of documents: ' . $count;
個別のフィールド値の取得
対応するそれぞれのクエリ構文の例を表示するには、次の Eloquent タブと Query Builder タブから選択します。
この例では、次のアクションを実行します。
MovieEloent モデルを使用して、sample_mflixデータベース内のmoviesコレクションを表しますクエリフィルターに一致するドキュメントの個別のフィールド値を
moviesコレクションから取得します個別の値を出力
この例では、 Movieモデルで次のメソッドを呼び出します。
where():directorsフィールドの値に"Sofia Coppola"が含まれるドキュメントと一致しますselect(): 一致するドキュメントのimdb.ratingフィールド値を取得しますdistinct(): 選択したフィールドの一意の値を検索し、値のリストを返しますget(): クエリ結果を検索します
$ratings = Movie::where('directors', 'Sofia Coppola') ->select('imdb.rating') ->distinct() ->get(); echo $ratings;
この例では、次のアクションを実行します。
DBファサードからtable()メソッドを呼び出してmoviesコレクションにアクセスしますクエリフィルターに一致するドキュメントの個別のフィールド値を
moviesコレクションから取得します個別の値を出力
この例では、次のクエリ ビルダのメソッドを呼び出します。
where():directorsフィールドの値に"Sofia Coppola"が含まれるドキュメントと一致しますselect(): 一致するドキュメントのimdb.ratingフィールド値を取得しますdistinct(): 選択したフィールドの一意の値を検索し、値のリストを返しますget(): クエリ結果を検索します
$ratings = DB::table('movies') ->where('directors', 'Sofia Coppola') ->select('imdb.rating') ->distinct() ->get(); echo $ratings;
詳細情報
MongoDB にデータを挿入する方法について詳しくは、「ドキュメントの挿入」ガイドを参照してください。