Docs Menu
Docs Home
/ / /
Lambda MongoDB
/

読み取り操作

項目一覧

  • 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 ...
...

一連の条件に一致する最初のドキュメントを取得するには、 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()メソッドの詳細については、このガイドの「クエリ結果のソート」セクションを参照してください。

戻る

データベースとコレクション