Overview
このガイドでは、 Lambda MongoDBを使用してMongoDBコレクションからデータを検索する方法を学びます。このガイドでは、データを検索するために使用できる Eloqueent モデル メソッドについて説明し、さまざまなタイプの検索操作の例を示します。
Lalavel 統合の Eloqueent モデルの詳細については、「 データのモデル化 」セクションを参照してください。
始める前に
このガイドのコード例を実行するには、「クイック スタート 」チュートリアルを完了してください。 このチュートリアルでは、サンプル データを使用して 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 ]); } }
Title: Inception Year: 2010 Runtime: 148 IMDB Rating: 8.8 IMDB Votes: 1294646 Plot: A thief who steals corporate secrets through use of dream-sharing technology is given the inverse task of planting an idea into the mind of a CEO. Title: Senna Year: 2010 Runtime: 106 IMDB Rating: 8.6 IMDB Votes: 41904 Plot: A documentary on Brazilian Formula One racing driver Ayrton Senna, who won the F1 world championship three times before his death at age 34.
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 ]); } }
Title: Statues also Die Year: 1953 Runtime: 30 IMDB Rating: 7.6 IMDB Votes: 620 Plot: A documentary of black art.
Tip
orderBy()メソッドの詳細については、「 クエリ結果の変更 」ガイドの「 クエリ結果のソート 」セクションを参照してください。
コレクション内のすべてのドキュメントを取得
クエリフィルターを省略すると、コレクション内のすべてのドキュメントを検索できます。 ドキュメントを返すには、コレクションを表す Elowent モデルでget()メソッドを呼び出します。 あるいは、 get()メソッドのエイリアスall()を使用して同じ操作を実行することもできます。
すべてのドキュメントに一致する検索操作を実行するには、次の構文を使用します。
$movies = Movie::get();
完全に実行可能な例
次のセクションでは、Lambdasample_mflix.movies 統合を使用してドキュメントを検索する方法を示す完全に実行可能なコード例を示します。これらの例では、Atlasサンプルデータセットの コレクションを使用します。
Tip
ドキュメントの検索
次の 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();
// Result is truncated { "_id": ..., "title": "This Is Spinal Tap", "directors": [ "Rob Reiner" ], ... }
この例では、次のアクションを実行します。
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;
This Is Spinal Tap
複数ドキュメントの検索
次の Eloquent タブと Query Builder タブから選択すると、対応する各 クエリ構文の例が表示されます。
この例では、次のアクションを実行します。
MovieEloent モデルを使用して、sample_mflixデータベース内のmoviesコレクションを表しますクエリフィルターに一致するドキュメントを
moviesコレクションから検索して印刷します
この例では、 Movieモデルで次のメソッドを呼び出します。
where():runtimeフィールドの値が900より大きいドキュメントに一致しますorderBy(): 一致したドキュメントを_id値の昇順で並べ替えますget(): クエリ結果を Lambdaコレクションオブジェクトとして取得します
$movies = Movie::where('runtime', '>', 900) ->orderBy('id') ->get();
// Results are truncated [ { "_id": ..., "runtime": 1256, "title": "Centennial", ..., }, { "_id": ..., "runtime": 1140, "title": "Baseball", ..., }, ... ]
この例では、次のアクションを実行します。
DBファサードからtable()メソッドを呼び出してmoviesコレクションにアクセスしますクエリフィルターに一致するドキュメントを
moviesコレクションから検索して印刷します
この例では、次のクエリ ビルダのメソッドを呼び出します。
where():runtimeフィールドの値が900より大きいドキュメントに一致しますorderBy(): 一致したドキュメントを_id値の昇順で並べ替えますget(): クエリ結果を Lambdaコレクションオブジェクトとして取得します
$movies = DB::table('movies') ->where('runtime', '>', 900) ->orderBy('_id') ->get();
// Results are truncated [ { "_id": ..., "runtime": 1256, "title": "Centennial", ..., }, { "_id": ..., "runtime": 1140, "title": "Baseball", ..., }, ... ]
ドキュメントをカウント
次の Eloquent タブと Query Builder タブから選択すると、対応する各 クエリ構文の例が表示されます。
この例では、次のアクションを実行します。
MovieEloent モデルを使用して、sample_mflixデータベース内のmoviesコレクションを表しますクエリフィルターに一致する
moviesコレクションからカウントする一致するドキュメント数を出力
この例では、 Movieモデルで次のメソッドを呼び出します。
where():genresフィールドの値に"Biography"が含まれるドキュメントと一致しますcount(): 一致するドキュメントの数をカウントし、その数を整数として返します
$count = Movie::where('genres', 'Biography') ->count(); echo 'Number of documents: ' . $count;
Number of documents: 1267
この例では、次のアクションを実行します。
DBファサードからtable()メソッドを呼び出してmoviesコレクションにアクセスしますクエリフィルターに一致する
moviesコレクションからカウントする一致するドキュメント数を出力
この例では、次のクエリ ビルダのメソッドを呼び出します。
where():genresフィールドの値に"Biography"が含まれるドキュメントと一致しますcount(): 一致するドキュメントの数をカウントし、その数を整数として返します
$count = DB::table('movies') ->where('genres', 'Biography') ->count(); echo 'Number of documents: ' . $count;
Number of documents: 1267
個別のフィールド値の取得
次の 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;
[[5.6],[6.4],[7.2],[7.8]]
この例では、次のアクションを実行します。
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;
[5.6,6.4,7.2,7.8]