Overview
このガイドでは、Lambda クエリ ビルダの Lambda 統合 拡張機能を使用して MongoDB database を操作する方法を学習できます。 クエリ ビルダを使用すると、単一の構文とスムーズなインターフェースを使用して、サポートされている任意のデータベースのクエリを作成できます。
注意
Lambel 統合は、Lambel のクエリ ビルダと Eloqueent ORM を拡張し、同様のデータベース操作を実行できます。 効率モデルを使用してドキュメントを取得する方法の詳細については、「 読み取り操作 」を参照してください。
Lambda はクエリ ビルダ クラス DBにアクセスするためのファサードを提供し、データベース操作を実行できるようにします。 クラスへの静的インターフェースである ファサード は、構文をより簡潔にし、ランタイム エラーを回避し、テスト可能性を向上させます。
Lambda 統合では、コレクションにアクセスするためのDBメソッドtable()が提供されます。 コマンドと制約を指定するためのチェーンメソッド。 次に、最後にget()メソッドをチェーンしてメソッドを実行し、結果を取得します。 最初の一致する結果のみを検索するには、 get()メソッドではなくfirst()メソッドを連鎖させます。 Lambda MongoDB v 5.0以降、クエリ ビルダはstdClassオブジェクトとして結果を返します。
次の例は、クエリ ビルダを呼び出す構文を示しています。
DB::table('<collection name>') // chain methods by using the "->" object operator ->get();
Tip
データベース接続の設定
DB::table()メソッドを使用する前に、アプリケーションのデフォルトのデータベース接続として MongoDB を指定していることを確認してください。 データベース接続を設定する手順については、クイック スタートの「 MongoDB 接続の構成 」の手順を参照してください。
MongoDB がアプリケーションのデフォルトのデータベースでない場合は、 DB::connection()メソッドを使用して MongoDB 接続を指定できます。 次のコードに示すように、 connection()メソッドに接続名を渡します。
$connection = DB::connection('mongodb');
このガイドでは、次のタイプのクエリ ビルダ操作の例を取り上げます。
始める前に
このガイドのコード例を実行するには、クイック スタートチュートリアル を完了して、Web アプリケーションを構成し、 サンプル データセット を MongoDB 配置にロードして、 コントローラー メソッドからサンプル コードを実行します。 期待されるコード出力を JSON ドキュメントとして確認するには、クイック スタートのオプションの「 JSON ドキュメントとして結果を表示する 」ステップに示されているtoJson()メソッドを使用します。
クエリ ビルダを使用して読み取りおよび書込み操作を実行するには、 Illuminate\Support\Facades\DBファサードをインポートしてクエリを作成します。
一致するドキュメントの取得
このセクションには、次の演算子カテゴリの読み取り操作のクエリ ビルダの例が含まれています。
メソッドの例
次の例は、 where()クエリ ビルダ メソッドを使用して、 imdb.ratingフィールド値が正確に9.3であるドキュメントをmoviesコレクションから検索する方法を示しています。 クエリによって返される結果を確認するには、[ VIEW OUTPUTボタンをクリックします。
$result = DB::connection('mongodb') ->table('movies') ->where('imdb.rating', 9.3) ->get();
[ { "title": "Cosmos", "year": 1980, "runtime": 60, "imdb": { "rating": 9.3, "votes": 17174, "id": 81846 }, "plot": "Astronomer Carl Sagan leads us on an engaging guided tour of the various elements and cosmological theories of the universe.", ... }, { "title": "The Shawshank Redemption", "year": 1994, "runtime": 142, "imdb": { "rating": 9.3, "votes": 1521105, "id": 111161 }, "plot": "Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency.", ... }, { "title": "The Real Miyagi", "year": 2015, "runtime": 90, "imdb": { "rating": 9.3, "votes": 41, "id": 2313306 }, "plot": "The life of the greatest karate master of a generation.", ... } ]
論理条件演算
このセクションの例では、次の論理条件操作を実行するために使用できるクエリビルダの構文を示します。
論理和の例
次の例では、 orWhere()クエリ ビルダ メソッドを連鎖させて、 _idフィールドの値がObjectId('573a1398f29313caabce9682')またはtitleフィールドの値が"Back to the Future"であるドキュメントをmoviesコレクションから検索する方法を示します。 :
$result = DB::connection('mongodb') ->table('movies') ->where('id', new ObjectId('573a1398f29313caabce9682')) ->orWhere('title', 'Back to the Future') ->get();
注意
id Alias
上記のコードに示すように、クエリでidエイリアスを使用して、MongoDB ドキュメントの_idフィールドを表すことができます。 クエリ ビルダを使用して検索操作を実行すると、Lambda 統合によって_idとidフィールド名の間が自動的に変換されます。 クエリ結果では、 _idフィールドはidとして表示されます。 これにより、Lambda との整合性が向上します。これは、各レコードがデフォルトでidという名前のプライマリキーを持っていることを前提としているためです。
この動作のため、ドキュメント内にidと_idの 2 つの個別のフィールドを含めることはできません。
埋め込みドキュメントでこの動作を無効にする方法については、接続オプションガイドの「ID フィールド名変換の使用を無効にする」セクションを参照してください。
論理 AND の例
次の例は、 where()クエリ ビルダ メソッドを連鎖させて、 8.5より大きいimdb.rating値と1940より小さいyear値の両方に一致するドキュメントをmoviesコレクションから検索する方法を示しています。
$result = DB::connection('mongodb') ->table('movies') ->where('imdb.rating', '>', 8.5) ->where('year', '<', 1940) ->get();
Tip
Lambel との互換性のため、Lambel MongoDB v 5.1は、クエリフィルター内のネストされたフィールドにアクセスするために、矢印(-> )とドット( . )表記の両方をサポートしています。上記の例では、ドット表記を使用して imdb.rating のネストされたフィールドをクエリしています。これは 推奨構文です。
論理和の例
次の例では、 whereNot()クエリ ビルダ メソッドを呼び出して、 imdb.ratingの値が2より大きくないドキュメントに一致するドキュメントをmoviesコレクションから検索する方法を示します。 これは、 imdb.ratingが2以下であるすべてのドキュメントをマッチングすることと同じです。
$result = DB::connection('mongodb') ->table('movies') ->whereNot('imdb.rating', '>', 2) ->get();
ネストされた論理演算子グループの例
次の例では、 where()クエリ ビルダ メソッドを連鎖させて、次の条件の両方に一致するドキュメントをmoviesコレクションから検索する方法を示します。 この例では、論理 OR グループをグループ化するために、 where()クエリ ビルダ メソッドの最初のパラメータとして包含を渡します。
imdb.ratingの値が より大きい8.5year値は1986または1996のいずれかです
$result = DB::connection('mongodb') ->table('movies') ->where('imdb.rating', '>', 8.5) ->where(function (Builder $query) { return $query ->where('year', 1986) ->orWhere('year', 1996); })->get();
範囲とタイプのチェック
このセクションの例は、次の範囲クエリと型チェック操作を使用して値を一致させるために使用できるクエリビルダの構文を示しています。
数値範囲の例
次の例は、 whereBetween()クエリ ビルダ メソッドを使用して、 9と9.5の間のimdb.rating値を含むドキュメントをmoviesコレクションから検索する方法を示しています。
$result = DB::connection('mongodb') ->table('movies') ->whereBetween('imdb.rating', [9, 9.5]) ->get();
[ { "title" "The Godfather", "imdb": { "rating": 9.2, "votes": 1038358, "id": 68646 }, ... }, { "title": "Hollywood", "imdb": { "rating": 9.1, "votes": 511,"id": 80230 }, ... }, { "title": "Cosmos", "imdb": { "rating": 9.3, "votes": 17174, "id": 81846 }, ... }, ... ]
NULL または欠損値の例
次の例は、 whereNull()クエリ ビルダ メソッドを使用して、 runtime値または フィールドを省略するドキュメントをmoviesコレクションから検索する方法を示しています。
$result = DB::connection('mongodb') ->table('movies') ->whereNull('runtime') ->get();
セットの 1 つ以上の値の例
次の例は、 whereIn()クエリ ビルダ メソッドを使用して、指定されたセット内のtitle値の少なくとも 1 つと一致するドキュメントをmoviesコレクションから検索する方法を示しています。
$result = DB::table('movies') ->whereIn('title', ['Toy Story', 'Shrek 2', 'Johnny English']) ->get();
[ { "title": "Toy Story", "year": 1995, "runtime": 81, ... }, { "title": "Johnny English", "year": 2003, "runtime": 87, ... }, { "title": "Shrek 2", "year" 2004, "runtime": 93, ... }, ... ]
一致日付の例
次の例では、 where()クエリ ビルダ メソッドを使用して、 released値がCarbonオブジェクトに指定されている15年 1 月2010であるドキュメントをmoviesコレクションから検索する方法を示します。
$result = DB::connection('mongodb') ->table('movies') ->where('released', Carbon::create(2010, 1, 15)) ->get();
注意
日付クエリフィルターと結果の型
Lambda MongoDB v5.0 以降、C 上記のコードに示すように、クエリフィルターとして渡されたオブジェクトは、UTCDateTime BSON値に変換されます。
クエリ結果では、MongoDB 内のUTCDateTime BSON 値がCarbonオブジェクトとして返されます。 Lambda 統合は、この変換を実行するときにデフォルトのタイムゾーンを適用します。
クエリフィルターで日付をCarbonオブジェクトとしてではなく、string として表するには、 whereDate()クエリビルダ メソッドを使用します。 次の例では、 moviesコレクションから、 released値が 1 月15日2010であり、日付を string として指定するドキュメントを検索します。
$result = DB::connection('mongodb') ->table('movies') ->whereDate('released', '2010-1-15') ->get();
テキストパターン一致の例
次の例は、 where()クエリビルダ メソッドでlikeクエリ演算子を使用し、指定されたテキスト パターンを使用してmoviesコレクションからドキュメントを検索する方法を示しています。
テキストパターンには、次のワイルドカード文字と混合したテキストを含めることができます。
%0 文字以上の文字に一致する_単一の文字に一致する
$result = DB::table('movies') ->where('title', 'like', '%spider_man%') ->get();
[ { "title": "Kiss of the Spider Woman", ... }, { "title": "Spider-Man", ... }, { "title": "Spider-Man 2", ...}, ... ]
whereLike() メソッドと whereNotLike() メソッド
次のメソッドは、パターンを一致させるためにクエリ演算子 を使用するのと同じ機能を提供します。
whereLike(): 指定されたパターンに一致します。 デフォルトでは、このメソッドは大文字と小文字を区別しない一致を実行します。 メソッドの最後のパラメータとしてtrueを渡すことで、大文字と小文字の区別を有効にすることができます。whereNotLike(): フィールド値に指定されたstringパターンが含まれていないドキュメントと一致します。
次の例は、 whereLike()メソッドを使用して、大文字と小文字の区別が有効になっているパターン'Start%'と一致する値がtitleフィールドにあるドキュメントを一致させる方法を示しています。
$result = DB::connection('mongodb') ->table('movies') ->whereLike('title', 'Start%', true) ->get();
[ { "title": "Start-Up", ... }, { "title": "Start the Revolution Without Me", ... }, ... ]
Retrieve Distinct Values
次の例は、 distinct()クエリ ビルダー メソッドを使用して、 moviesコレクション内のドキュメントのyearフィールドのさまざまな値をすべて検索する方法を示しています。
$result = DB::table('movies') ->distinct('year')->get();
集計
このセクションの例では、集計を実行するために使用できるクエリ ビルダの構文を示します。 集計は、クエリ結果データのセットから値を計算する操作です。 集計を使用して、次の情報を計算して返すことができます。
一般的なフィールド値でグループ化された結果の例
次の例は、 groupBy()クエリ ビルダ メソッドを使用して、 runtimeフィールドの共有値でグループ化されたドキュメント データを取得する方法を示しています。 この例では、次の操作を連鎖させて、 Gのrated値を含み、かつ個別のruntime値ごとに 1 つの映画のtitleフィールドを含むmoviesコレクションのドキュメントを照合します。
where()メソッドを使用して、ratedフィールド値が"G"であるドキュメントのみをマッチングするgroupBy()メソッドを使用して、_idフィールドに割り当てられているruntimeフィールドの個別の値でデータをグループ化しますorderBy()メソッドを使用して、runtimeフィールドでグループを並べ替えますグループ化された結果内の最後のドキュメントの
titleデータを、get()メソッドで指定して返します
Tip
groupBy()メソッドは MongoDB $group集計演算子と$lastアキュムレータ演算子を呼び出します。 これらの演算子の詳細については、サーバー マニュアルの$group(集計)を参照してください。
$result = DB::table('movies') ->where('rated', 'G') ->groupBy('runtime') ->orderBy('runtime', 'asc') ->get(['title']);
[ ... { "_id": { "runtime": 64 }, "runtime": 64, "title": "Stitch! The Movie" }, { "_id": { "runtime": 67 }, "runtime": 67, "title": "Bartok the Magnificent" }, { "_id": { "runtime":68 }, "runtime": 68, "title": "Mickey's Twice Upon a Christmas" }, ... ]
結果数の例
次の例は、 count()クエリ ビルダ メソッドを使用してmoviesコレクションに含まれるドキュメントの数を返す方法を示しています。
$result = DB::table('movies') ->count();
フィールド例の最大値
次の例は、 max()クエリ ビルダ メソッドを使用して、 moviesコレクション全体からruntimeフィールドの最大の数値を返す方法を示しています。
$result = DB::table('movies') ->max('runtime');
フィールドの例の最小値
次の例は、 min()クエリ ビルダ メソッドを使用して、 moviesコレクション全体からyearフィールドの最小の数値を返す方法を示しています。
$result = DB::table('movies') ->min('year');
フィールド例の平均値
次の例は、 avg()クエリ ビルダ メソッドを使用して、 moviesコレクション全体からimdb.rating値の数値平均または算術平均を返す方法を示しています。
$result = DB::table('movies') ->avg('imdb.rating');
フィールドの合計値の例
次の例は、 sum()クエリ ビルダ メソッドを使用して、 moviesコレクション全体からimdb.votes値の数値合計を返す方法を示しています。
$result = DB::table('movies') ->sum('imdb.votes');
一致した結果の集計の例
次の例では、クエリに一致する結果からデータを集計する方法を示しています。 クエリは、 2000年以降のすべての映画に一致しており、 avg()メソッドを使用して、それらの一致のimdb.ratingの平均値を計算します。
$result = DB::table('movies') ->where('year', '>', 2000) ->avg('imdb.rating');
クエリレベルのオプションを設定する
クエリ ビルダでオプションを設定することで、Lambda 統合が操作を実行する方法を変更できます。 オプションの配列を options() クエリ ビルダ メソッドに渡して、クエリのオプションを指定できます。
次のコードは、クエリにコメントを添付する方法を示しています。
$result = DB::connection('mongodb') ->table('movies') ->where('year', 2000) ->options(['comment' => 'hello']) ->get();
クエリ ビルダは、 MongoDB PHPライブラリで find() メソッドに設定できるオプションと同じオプションを受け入れます。skipsort、 、limit などのクエリ結果を変更するための一部のオプションは、クエリ ビルダーのメソッドとして直接設定でき、このガイドの「 クエリ結果の変更 」セクションで説明されています。オプションとしてメソッドを渡す代わりに、これらのメソッドを使用することをお勧めします。
クエリ結果の変更
このセクションには、クエリ結果の順序と形式を変更する次の関数のクエリ ビルダの例が含まれています。
注文結果の例
次の例は、 orderBy()クエリ ビルダ メソッドを使用して、 titleフィールドに指定されたフィルターに一致する結果をimdb.ratingの値で降順に配置する方法を示しています。
$result = DB::table('movies') ->where('title', 'like', 'back to the future%') ->orderBy('imdb.rating', 'desc') ->get();
[ { "title": "Back to the Future", "imdb": { "rating":8.5,"votes":636511,"id":88763 }, ... }, { "title": "Back to the Future Part II", "imdb": { "rating":7.8,"votes":292539,"id":96874 }, ... }, { "title": "Back to the Future Part III", "imdb": {"rating":7.4,"votes":242390,"id":99088 }, ... }, ... ]
指定した数の結果を省略する例
次の例では、 skip()クエリ ビルダ メソッドを使用して、 titleフィールドに指定されたフィルターに一致する最初の 4 つの結果を除外する方法を示します。 year値の昇順でソートします。
$result = DB::table('movies') ->where('title', 'like', 'star trek%') ->orderBy('year', 'asc') ->skip(4) ->get();
結果の例に含まれるフィールドと配列値のサブセットの表示
次の例では、 project()クエリ ビルダ メソッドを使用して、 8.5よりも高いimdb.rating値を含むドキュメントを照合し、次のフィールド値のみを返す方法を示します。
内の映画のタイトル
titlecast配列フィールドの 2 番目から 4 番目の値(存在する場合)ドキュメント
_idフィールド(自動的に含まれる)
$result = DB::table('movies') ->where('imdb.rating', '>', 8.5) ->project([ 'title' => 1, 'cast' => ['$slice' => [1, 3]], ]) ->get();
[ { "_id": { ... }, "title": "City Lights" "cast": [ "Florence Lee", "Harry Myers", "Al Ernest Garcia" ], }, { "_id": { ... }, "title": "Modern Times", "cast": [ "Paulette Goddard", "Henry Bergman", "Tiny Sandford" ] }, { "_id": { ... }, "title": "Casablanca" "cast": [ "Ingrid Bergman", "Paul Henreid", "Claude Rains" ], }, ... ]
結果のページ分割の例
次の例では、 paginate()クエリ ビルダー メソッドを使用して、 movieコレクション全体を15ドキュメントの個別の結果セットに分割する方法を示します。 この例には、 imdb.votesフィールドの結果を降順で配置するための並べ替え順序と、結果に特定のフィールドのみを含むプロジェクションも含まれています。
$resultsPerPage = 15; $projectionFields = ['title', 'runtime', 'imdb.rating']; $result = DB::table('movies') ->orderBy('imdb.votes', 'desc') ->paginate($resultsPerPage, $projectionFields);
ページネーションの詳細については、Lambda ドキュメントの「クエリ ビルダの結果のページ分割」を参照してください。
MongoDB 操作を使用したデータの取得
このセクションには、次の MongoDB 固有のクエリ操作の使用方法を示すクエリ ビルダの例が含まれています。
フィールドの例が含まれています
次の例は、 exists()クエリ ビルダ メソッドを使用して、フィールドrandom_reviewを含むドキュメントを一致させる方法を示しています。
$result = DB::table('movies') ->exists('random_review', true);
このクエリ演算子の詳細については、サーバー マニュアルの$existsを参照してください。
すべてのフィールドの例を含む
次の例は、allクエリ演算子と where() クエリ ビルダ メソッドを組み合わせて、指定されたすべての値を含む writers 配列フィールドを持つドキュメントを一致させる方法を示しています。
$result = DB::table('movies') ->where('writers', 'all', ['Ben Affleck', 'Matt Damon']) ->get();
このクエリ演算子の詳細については、サーバー マニュアルの$allを参照してください。
配列サイズに一致する例
次の例は、 where()クエリビルダ メソッドでsizeクエリ演算子を渡し、5 つの要素だけの配列を含むdirectorsフィールドを含むドキュメントを一致させる方法を示しています。
$result = DB::table('movies') ->where('directors', 'size', 5) ->get();
このクエリ演算子の詳細については、サーバー マニュアルの$sizeを参照してください。
一致データ型の例
次の例では、 where()クエリビルダ メソッドでtypeクエリ演算子を渡し、 releasedフィールドに配列データ型に対応するタイプ4の値を含むドキュメントを照合する方法を示します。
$result = DB::table('movies') ->where('released', 'type', 4) ->get();
型コードとクエリ演算子の詳細については、サーバー マニュアルの$typeを参照してください。
剰余の例えで計算された値に一致
次の例は、 where()クエリビルダ メソッドでmodクエリ演算子を渡し、 yearフィールドの偶数値に一致する式year % 2 == 0を使用してドキュメントを照合する方法を示しています。
$result = DB::table('movies') ->where('year', 'mod', [2, 0]) ->get();
このクエリ演算子の詳細については、サーバー マニュアルの$modを参照してください。
正規表現に一致する
次の例は、 where()クエリビルダ メソッドでREGEXクエリ演算子を渡し、指定された正規表現に一致するtitleフィールドを含むドキュメントを照合する方法を示しています。
$result = DB::connection('mongodb') ->table('movies') ->where('title', 'REGEX', new Regex('^the lord of .*', 'i')) ->get();
MongoDB の正規表現クエリの詳細については、サーバー マニュアルの$regexを参照してください。
MongoDB Query API 操作の実行例
次の例は、 whereRaw()クエリビルダー メソッドを使用して、MongoDB Query API 構文を使用して記述されたクエリ操作を実行する方法を示しています。
$result = DB::table('movies') ->whereRaw([ 'imdb.votes' => ['$gte' => 1000], '$or' => [ ['imdb.rating' => ['$gt' => 7]], ['directors' => ['$in' => ['Yasujiro Ozu', 'Sofia Coppola', 'Federico Fellini']]], ], ])->get();
次のコードは、同等の MongoDB Query API 構文を示しています。
db.movies.find({ "imdb.votes": { $gte: 1000 }, $or: [{ imdb.rating: { $gt: 7 }, directors: { $in: [ "Yasujiro Ozu", "Sofia Coppola", "Federico Fellini" ] } }]});
MongoDB Query API の詳細については、サーバー マニュアルの「 MongoDB Query API 」を参照してください。
配列要素の一致の例
次の例は、 where()クエリビルダ メソッドでelemMatchクエリ演算子を渡し、指定されたクエリ内の条件の 1 つ以上に一致する配列要素を含むドキュメントを検索する方法を示しています。
$result = DB::table('movies') ->where('writers', 'elemMatch', ['$in' => ['Maya Forbes', 'Eric Roth']]) ->get();
MongoDB の正規表現クエリの詳細については、サーバー マニュアルの$elemMatch 演算子を参照してください。
カーソル タイムアウトの指定の例
次の例では、 timeout()メソッドを使用してカーソル操作の完了まで待機する最大期間を指定する方法を示します。
$result = DB::table('movies') ->timeout(2) // value in seconds ->where('year', 2001) ->get();
注意
この設定では、ミリ秒ではなく秒単位でmaxTimeMS値を指定します。 maxTimeMS値の詳細については、PHP ライブラリのドキュメントのMongoDBCollection::find()を参照してください。
読み込み設定(read preference)の指定の例
読み込み設定 (read preference)を設定することで、Lambda 統合がレプリカセットノードに読み取り操作をどのように指示するかを制御できます。
次の例では、moviesコレクションで、runtime の値が 240 より大きいドキュメントをクエリします。この例ではReadPreference::SECONDARY_PREFERRED の値を readPreference() メソッドに渡します。これにより、セカンダリレプリカセットメンバーまたは、セカンダリが使用できない場合は、プライマリ メンバーにクエリが送信されます。
$result = DB::table('movies') ->where('runtime', '>', 240) ->readPreference(ReadPreference::SECONDARY_PREFERRED) ->get();
Tip
読み込み設定(read preference)の詳細については、 MongoDB Serverマニュアルの 読み込み設定 (read preference) を参照してください。
地理空間操作を使用したロケーションの一致
このセクションの例では、クエリ ビルダの構文を使用して GeoJSON または座標ペア データに対して地理空間クエリを実行し、次のタイプのロケーションを検索できます。
重要
MongoDB で GeoJSON クエリを実行するには、コレクションに2dまたは2dsphereインデックスのいずれかを作成する必要があります。 地理空間インデックスの作成方法については、「 スキーマ ビルダ 」のガイドの「 地理空間インデックスの作成」セクションを参照してください。
MongoDB がサポートするGeoJSON オブジェクトの詳細については、サーバー マニュアルの「 GeoJSON オブジェクト」を参照してください。
位置の例えに近い
次の例は、 nearクエリ演算子とwhere()クエリ ビルダ メソッドを使用して、GeoJSON ポイント オブジェクトから最大50メートルのロケーションを含むドキュメントを一致させる方法を示しています。
$results = DB::table('theaters') ->where('location.geo', 'near', [ '$geometry' => [ 'type' => 'Point', 'coordinates' => [ -86.6423, 33.6054, ], ], '$maxDistance' => 50, ])->get();
この演算子の詳細については、サーバー マニュアルの「 $near 演算子」を参照してください。
エリア内の例
次の例は、 geoWithinクエリ演算子とwhere()クエリ ビルダ メソッドを使用して、指定されたPolygon GeoJSON オブジェクトの境界内のロケーションを含むドキュメントを照合する方法を示しています。
$results = DB::table('theaters') ->where('location.geo', 'geoWithin', [ '$geometry' => [ 'type' => 'Polygon', 'coordinates' => [ [ [-72, 40], [-74, 41], [-72, 39], [-72, 40], ], ], ], ])->get();
ジオメトリの交差の例
次の例は、 geoInstersectsクエリ演算子とwhere()クエリ ビルダ メソッドを使用して、指定されたLineString GeoJSON オブジェクトと交差するロケーションを含むドキュメントを照合する方法を示しています。
$results = DB::table('theaters') ->where('location.geo', 'geoIntersects', [ '$geometry' => [ 'type' => 'LineString', 'coordinates' => [ [-73.600525, 40.74416], [-72.600525, 40.74416], ], ], ])->get();
近傍一致の近接データの例
次の例では、 geoNear集計演算子とraw()クエリ ビルダ メソッドを組み合わせて、各一致の近接性情報などのメタデータを返す集計を実行する方法を示します。
$results = DB::table('theaters')->raw( function (Collection $collection) { return $collection->aggregate([ [ '$geoNear' => [ 'near' => [ 'type' => 'Point', 'coordinates' => [-118.34, 34.10], ], 'distanceField' => 'dist.calculated', 'maxDistance' => 500, 'includeLocs' => 'dist.location', 'spherical' => true, ], ], ]); }, )->toArray();
この集計演算子の詳細については、サーバー マニュアルの「 $geoNear 演算子」を参照してください。
MongoDB 書込み操作を使用したデータの書込み
このセクションには、次の MongoDB 固有の書込み操作の使用方法を示すクエリ ビルダの例が含まれています。
ドキュメントのアップサートの例
v 4.7以降、 次のクエリ ビルダのメソッドのいずれかを使用して、アップサート操作を実行できます。
upsert(): このメソッドを使用すると、バッチ アップサートを実行して 1 回の操作で複数のドキュメントを変更または挿入できます。update(): このメソッドを使用する場合、クエリフィルターに一致するすべてのドキュメントを更新するか、一致するドキュメントがない場合は 1 つのドキュメントを挿入するために、upsertオプションを指定する必要があります。 このアップサート メソッドのみが v 4.6以前のバージョンではサポートされています。
アップサートの方法
upsert(array $values, array|string $uniqueBy, array|null
$update)クエリ ビルダのメソッドは次のパラメータを受け入れます。
$values: 更新または挿入するドキュメントを指定するフィールドと値の配列。$uniqueBy: 最初の配列パラメータでドキュメントを一意に識別するフィールドのリスト。$update: 一致するドキュメントが存在する場合に更新するフィールドの任意のリスト。 このパラメーターを省略すると、Lambda 統合によってすべてのフィールドが更新されます。
以下の例では、 upsert()クエリ ビルダ メソッドを使用して、次の手順に基づいてドキュメントを更新または挿入する方法を示しています。
titleフィールドの値が'Inspector Maigret'、recommendedフィールドの値がfalse、runtimeフィールドの値が128であるドキュメントを指定します。titleフィールドの値が'Petit Maman'、recommendedフィールドの値がtrue、runtimeフィールドの値が72であるドキュメントを指定します。titleフィールドが操作範囲内のドキュメントを一意に識別することを示します。一致したドキュメントの
recommendedフィールドのみをアップデートします。
$result = DB::table('movies') ->upsert( [ ['title' => 'Inspector Maigret', 'recommended' => false, 'runtime' => 128], ['title' => 'Petit Maman', 'recommended' => true, 'runtime' => 72], ], 'title', 'recommended', );
upsert()クエリ ビルダ メソッドは、操作によって更新、挿入、変更されたドキュメントの数を返します。
注意
upsert() メソッドは イベントをtriggerしません。 アップサート操作からイベントをtriggerするには、代わりに createOrFirst() メソッドを使用できます。
更新方法
次の例は、 update()クエリビルダー メソッドとupsertオプションを使用して一致するドキュメントをアップデートするか、存在しない場合は指定されたデータでドキュメントを挿入する方法を示しています。 upsertオプションをtrueに設定し、かつドキュメントが存在しない場合、コマンドはデータとwhere()クエリ操作で指定されたtitleフィールドと値の両方を挿入します。
$result = DB::table('movies') ->where('title', 'Will Hunting') ->update( [ 'plot' => 'An autobiographical movie', 'year' => 1998, 'writers' => ['Will Hunting'], ], ['upsert' => true], );
update()クエリ ビルダ メソッドは、操作によって更新または挿入されたドキュメントの数を返します。
数値の乗算と除算の例
Lambda 統合 v5.5 以降では、multiply() と divide() クエリ ビルダ メソッドを使用して、数値に対して乗算および除算操作を実行できます。
次の例は、multiply() メソッドと divide() メソッドを使用して imdb.votes フィールドと runtime フィールドの値を操作する方法を示しています。
$result = DB::table('movies') ->where('year', 2001) ->multiply('imdb.votes', 5); $result = DB::table('movies') ->where('year', 2001) ->divide('runtime', 2);
Tip
update() メソッド
update() メソッドを使用し、$mul 演算子を含む更新ドキュメントを渡すことで、同じ操作を実行できます。update() について詳しくは、「ドキュメントの修正」ガイドを参照してください。
オプションで、次の例に示すように、配列パラメータを渡して、 同じ操作で $set 更新を実行することもできます。
$result = DB::table('movies') ->where('year', 1958) ->multiply('runtime', 1.5, ['note' => 'Adds recovered footage.']);
数値の増加の例
次の例は、 increment()クエリ ビルダ メソッドを使用して、一致したドキュメントのimdb.votesフィールドの値に3000を追加する方法を示しています。
$result = DB::table('movies') ->where('title', 'Field of Dreams') ->increment('imdb.votes', 3000);
increment()クエリ ビルダ メソッドは、操作によって更新されたドキュメントの数を返します。
Lambda 統合 v 4.8以降 また、 incrementEach()クエリ ビルダ メソッドを使用して、1 回の操作で複数の値を増加させることもできます。 incrementEach()次の例では、awards.wins imdb.votesメソッドを使用して、一致したドキュメントの フィールドと フィールドの値を増やします。
$result = DB::table('movies') ->where('title', 'Lost in Translation') ->incrementEach([ 'awards.wins' => 2, 'imdb.votes' => 1050, ]);
注意
値がないフィールド、または一致したドキュメントに存在しないフィールドをincrement()メソッドまたはincrementEach()メソッドに渡すと、これらのメソッドは指定されたフィールドを増分値に初期化します。
数値の減算の例
次の例は、 decrement()クエリ ビルダ メソッドを使用して、一致したドキュメントのimdb.ratingフィールドの値から0.2を減算する方法を示しています。
$result = DB::table('movies') ->where('title', 'Sharknado') ->decrement('imdb.rating', 0.2);
decrement()クエリ ビルダ メソッドは、操作によって更新されたドキュメントの数を返します。
Lambda 統合 v 4.8以降 また、 decrementEach()クエリ ビルダ メソッドを使用して、1 回の操作で複数の値を減算することもできます。 decrementEach()次の例では、metacritic imdb.ratingメソッドを使用して、一致したドキュメントの フィールドと フィールドの値を減らします。
$result = DB::table('movies') ->where('title', 'Dunkirk') ->decrementEach([ 'metacritic' => 1, 'imdb.rating' => 0.4, ]);
注意
値がないフィールド、または一致したドキュメントに存在しないフィールドをdecrement()メソッドまたはdecrementEach()メソッドに渡すと、これらのメソッドは指定されたフィールドを減算値に初期化します。
配列要素を追加する例
次の例は、 push()クエリビルダ メソッドを使用して、一致したドキュメントのcast配列フィールドに"Gary Cole"を追加する方法を示しています。
$result = DB::table('movies') ->where('title', 'Office Space') ->push('cast', 'Gary Cole');
push()クエリ ビルダ メソッドは、操作によって更新されたドキュメントの数を返します。
配列要素の削除の例
次の例は、 pull()クエリ ビルダ メソッドを使用して、クエリに一致するドキュメントのgenresフィールドから"Adventure"値を削除する方法を示しています。
$result = DB::table('movies') ->where('title', 'Iron Man') ->pull('genres', 'Adventure');
pull()クエリ ビルダ メソッドは、操作によって更新されたドキュメントの数を返します。
フィールドを削除する例
次の例は、 unset()クエリ ビルダ メソッドを使用して、クエリに一致するドキュメントからtomatoes.viewerフィールドと値を削除する方法を示しています。
$result = DB::table('movies') ->where('title', 'Final Accord') ->unset('tomatoes.viewer');
unset()クエリ ビルダ メソッドは、操作によって更新されたドキュメントの数を返します。