読み取り操作
項目一覧
Overview
このガイドでは、Lambda MongoDB を使用して MongoDB コレクションに対して検索操作を実行する方法を学習できます。 検索操作では、指定した条件に基づいてドキュメントを検索できます。
このガイドでは、次のタスクを実行する方法について説明します。
始める前に
このガイドのコード例を実行するには、 クイック スタートチュートリアルを完了します。 このチュートリアルでは、サンプル データを使用して MongoDB Atlas インスタンスを設定し、Lambda ウェブ アプリケーションで次のファイルを作成する手順を説明します。
Movie.php
ファイル(movies
コレクション内のドキュメントを表すMovie
モデルを含む)MovieController.php
ファイル(データベース操作を実行するためのshow()
関数を含む)browse_movies.blade.php
データベース操作の結果を表示するための HTML コードを含む ファイル
次のセクションでは、Laravel アプリケーション内のファイルを編集して検索操作コード例を実行し、期待される出力を表示する方法について説明します。
クエリに一致するドキュメントの取得
Lambda の Eloqueent オブジェクト関係マッパー(ORM)を使用して、MongoDB コレクションを表すモデルを作成し、その上でクエリ条件を指定するためにメソッドを連鎖させることができます。
一連の条件に一致するドキュメントを検索するには、コレクションの対応する Eloqueent モデルでwhere()
メソッドを呼び出し、クエリフィルターを メソッドに渡します。
クエリフィルターは、フィールド値の要件を指定し、これらの要件を満たすドキュメントのみを返すように検索操作に指示します。
クエリを構築するには、次のwhere()
メソッド呼び出しのいずれかを使用できます。
where('<field name>', <value>)
ターゲット フィールドが正確に指定された値を持つドキュメントに一致するクエリを構築しますwhere('<field name>', '<comparison operator>', <value>)
ターゲット フィールドの値が比較条件を満たすドキュメントに一致するクエリを構築します
検索操作に複数の条件セットを適用するには、一連のwhere()
メソッドを連鎖させることができます。
where()
メソッドを使用してクエリを作成したら、 get()
メソッドを連鎖させてクエリ結果を検索します。
この例では、 Movie
Elastic モデルで 2 つのwhere()
メソッドを呼び出して、次の条件を満たすドキュメントを検索します。
year
フィールドの値は2010
imdb.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 クエリ ビルダを使用して配列フィールドをクエリする方法については、 クエリ ビルダ ガイドの「配列要素の一致」セクションを参照してください。
コレクション内のすべてのドキュメントを取得
クエリフィルターを省略すると、コレクション内のすべてのドキュメントを検索できます。 ドキュメントを返すには、コレクションを表す Elowent モデルでget()
メソッドを呼び出します。 あるいは、 get()
メソッドのエイリアスall()
を使用して同じ操作を実行することもできます。
すべてのドキュメントに一致する検索操作を実行するには、次の構文を使用します。
$movies = Movie::get();
警告
Atlas サンプル データセットのmovies
コレクションには大量のデータが含まれています。 このコレクション内のすべてのドキュメントを取得して表示すると、ウェブ アプリケーションがタイムアウトする可能性があります。
この問題を回避するには、 take()
メソッドを使用してドキュメント制限を指定します。 take()
の詳細については、このガイドの「動作の変更 」セクションを参照してください。
検索テキスト フィールド
テキスト検索では、テキスト インデックス フィールドにタームまたはフレーズを含むドキュメントが検索されます。 タームは、空白文字を除外する文字のシーケンスです。 フレーズは、任意の数の空白文字を含むタームのシーケンスです。
注意
テキスト検索を実行する前に、テキスト値フィールドにテキスト インデックスを作成する必要があります。 インデックスの作成の詳細については、 スキーマ ビルダ ガイドの「インデックスの管理」セクションを参照してください。
$text演算子を使用し、その後にwhere()
メソッドに渡すクエリフィルター内の$search
フィールドを使用して、テキスト検索を実行できます。 $text
演算子は、テキスト インデックス付きフィールドでテキスト検索を実行します。 $search
フィールドは、検索するテキストを指定します。
where()
メソッドを使用してクエリを作成したら、 get()
メソッドを連鎖させてクエリ結果を検索します。
この例では、 Movie
Elonger モデルのwhere()
メソッドを呼び出して、 plot
フィールドにフレーズ"love story"
が含まれるドキュメントを検索します。 このテキスト検索を実行するには、コレクションにplot
フィールドのテキスト インデックスが 必要 です。
クエリを指定するには、次の構文を使用します。
$movies = Movie::where('$text', ['$search' => '"love story"']) ->get();
browse_movies
ビューでクエリ結果を表示するには、 MovieController.php
ファイルのshow()
関数を次のコードのように編集します。
class MovieController { public function show() { $movies = Movie::where('$text', ['$search' => '"love story"']) ->get(); return view('browse_movies', [ 'movies' => $movies ]); } }
Title: Cafè de Flore Year: 2011 Runtime: 120 IMDB Rating: 7.4 IMDB Votes: 9663 Plot: A love story between a man and woman ... Title: Paheli Year: 2005 Runtime: 140 IMDB Rating: 6.7 IMDB Votes: 8909 Plot: A folk tale - supernatural love story about a ghost ... Title: Por un puèado de besos Year: 2014 Runtime: 98 IMDB Rating: 6.1 IMDB Votes: 223 Plot: A girl. A boy. A love story ... ...
テキスト検索では、数値テキスト スコアが割り当てられ、各結果がクエリフィルター内の string にどの程度一致するかを示します。 関連性で結果を並べ替えるには、 orderBy()
メソッドを使用してtextScore
メタデータ フィールドで並べ替えます。 $meta演算子を使用して、このメタデータにアクセスできます。
$movies = Movie::where('$text', ['$search' => '"love story"']) ->orderBy('score', ['$meta' => 'textScore']) ->get();
Tip
orderBy()
メソッドの詳細については、このガイドの「クエリ結果のソート」セクションを参照してください。
動作の変更
検索操作の結果を変更するには、 where()
にメソッドを連鎖させます。
次のセクションでは、 where()
メソッドの動作を変更する方法を示します。
スキップして結果を制限するには、
skip()
メソッドを使用してスキップするドキュメント数を設定し、take()
メソッドを使用して返されるドキュメントの合計数を設定しますクエリ結果のソート
orderBy()
メソッドを使用して、フィールド値に基づいて指定された順序でクエリ結果を返します。最初の結果を返すには、
first()
メソッドを使用して、クエリフィルターに一致する最初のドキュメントを返します
結果をスキップして結果を制限する
この例では、 year
の値が1999
であるドキュメントをクエリします。 この操作では、一致する最初の2
ドキュメントがスキップされ、合計で3
ドキュメントが出力されます。
クエリを指定するには、次の構文を使用します。
$movies = Movie::where('year', 1999) ->skip(2) ->take(3) ->get();
browse_movies
ビューでクエリ結果を表示するには、 MovieController.php
ファイルのshow()
関数を次のコードのように編集します。
class MovieController { public function show() { $movies = Movie::where('year', 1999) ->skip(2) ->take(3) ->get(); return view('browse_movies', [ 'movies' => $movies ]); } }
Title: Three Kings Year: 1999 Runtime: 114 IMDB Rating: 7.2 IMDB Votes: 130677 Plot: In the aftermath of the Persian Gulf War, 4 soldiers set out to steal gold that was stolen from Kuwait, but they discover people who desperately need their help. Title: Toy Story 2 Year: 1999 Runtime: 92 IMDB Rating: 7.9 IMDB Votes: 346655 Plot: When Woody is stolen by a toy collector, Buzz and his friends vow to rescue him, but Woody finds the idea of immortality in a museum tempting. Title: Beowulf Year: 1999 Runtime: 95 IMDB Rating: 4 IMDB Votes: 9296 Plot: A sci-fi update of the famous 6th Century poem. In a besieged land, Beowulf must battle against the hideous creature Grendel and his vengeance seeking mother.
クエリ結果のソート
指定されたフィールドの値に基づいてクエリ結果を順序付けするには、 where()
メソッドとそれに続くorderBy()
メソッドを使用します。
結果に対して昇順または降順の並べ替え方向を設定できます。 デフォルトでは、 orderBy()
メソッドは指定されたフィールド名に対して昇順の並べ替えを設定しますが、2 番目のパラメーターとして"asc"
を渡すことで、昇順の並べ替えを明示的に指定できます。 降順の並べ替えを指定するには、2 番目のパラメーターとして"desc"
を渡します。
ドキュメント内の特定のフィールドに重複する値が含まれている場合は、並べ替え対象のフィールドをさらに指定することで同順位に対応できます。 これにより、他のフィールドに一意の値が含まれている場合でも、結果の一貫性が確保されます。
この例では、 countries
フィールドの値に"Indonesia"
が含まれているドキュメントをクエリし、最初にyear
フィールドで昇順に並べ替え、次にtitle
フィールドで降順で並べ替えます。
クエリを指定するには、次の構文を使用します。
$movies = Movie::where('countries', 'Indonesia') ->orderBy('year') ->orderBy('title', 'desc') ->get();
browse_movies
ビューでクエリ結果を表示するには、 MovieController.php
ファイルのshow()
関数を次のコードのように編集します。
class MovieController { public function show() { $movies = Movie::where('countries', 'Indonesia') ->orderBy('year') ->orderBy('title', 'desc') ->get(); return view('browse_movies', [ 'movies' => $movies ]); } }
Title: Joni's Promise Year: 2005 Runtime: 83 IMDB Rating: 7.6 IMDB Votes: 702 Plot: A film delivery man promises ... Title: Gie Year: 2005 Runtime: 147 IMDB Rating: 7.5 IMDB Votes: 470 Plot: Soe Hok Gie is an activist who lived in the sixties ... Title: Requiem from Java Year: 2006 Runtime: 120 IMDB Rating: 6.6 IMDB Votes: 316 Plot: Setyo (Martinus Miroto) and Siti (Artika Sari Dewi) are young married couple ... ...
Tip
並べ替えの詳細については、次のリソースを参照してください。
サーバー マニュアルの用語集における自然な順序
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()
メソッドの詳細については、このガイドの「クエリ結果のソート」セクションを参照してください。