クエリ ビルダ
項目一覧
- Overview
- 始める前に
- 一致するドキュメントの取得
- メソッドの例
- 論理条件演算
- 範囲とタイプのチェック
- テキストパターン一致の例
- Retrieve Distinct Values
- 集計
- 一般的なフィールド値でグループ化された結果の例
- 結果数の例
- フィールド例の最大値
- フィールドの例の最小値
- フィールド例の平均値
- フィールドの合計値の例
- 一致した結果の集計の例
- クエリ結果の変更
- 注文結果の例
- 指定した数の結果を省略する例
- 結果の例に含まれるフィールドと配列値のサブセットの表示
- 結果のページ分割の例
- MongoDB 操作を使用したデータの取得
- フィールドの例が含まれています
- すべてのフィールドの例を含む
- 配列サイズに一致する例
- 一致データ型の例
- 剰余の例えで計算された値に一致
- 正規表現に一致する
- MongoDB Query API 操作の実行例
- 配列要素の一致の例
- カーソル タイムアウトの指定の例
- 地理空間操作を使用したロケーションの一致
- 位置の例えに近い
- エリア内の例
- ジオメトリの交差の例
- 近傍一致の近接データの例
- MongoDB 書込み操作を使用したデータの書込み
- ドキュメントのアップサートの例
- 数値の増加の例
- 数値の減算の例
- 配列要素を追加する例
- 配列要素の削除の例
- フィールドを削除する例
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
エイリアスを使用して、MongoDB ドキュメントの_id
フィールドを表すことができます。 クエリ ビルダを使用して検索操作を実行すると、Lambda 統合によって_id
とid
フィールド名の間が自動的に変換されます。 クエリ結果では、 _id
フィールドはid
として表示されます。 これにより、Lambda との整合性が向上します。これは、各レコードがデフォルトでid
という名前のプライマリキーを持っていることを前提としているためです。
この動作のため、ドキュメント内にid
と_id
の 2 つの個別のフィールドを含めることはできません。
論理 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.5
year
値は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();
注意
日付クエリフィルターと結果の型
クエリフィルターで日付を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');
クエリ結果の変更
このセクションには、クエリ結果の順序と形式を変更する次の関数のクエリ ビルダの例が含まれています。
注文結果の例
次の例は、 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
値を含むドキュメントを照合し、次のフィールド値のみを返す方法を示します。
内の映画のタイトル
title
cast
配列フィールドの 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);
MongoDB 操作を使用したデータの取得
このセクションには、次の MongoDB 固有のクエリ操作の使用方法を示すクエリ ビルダの例が含まれています。
フィールドの例が含まれています
次の例は、 exists()
クエリ ビルダ メソッドを使用して、フィールドrandom_review
を含むドキュメントを一致させる方法を示しています。
$result = DB::table('movies') ->exists('random_review', true);
このクエリ演算子の詳細については、サーバー マニュアルの$existsを参照してください。
すべてのフィールドの例を含む
次の例は、 all
クエリ演算子とwhere()
クエリ ビルダ メソッドを使用して、指定されたすべてのフィールドを含むドキュメントを照合する方法を示しています。
$result = DB::table('movies') ->where('movies', 'all', ['title', 'rated', 'imdb.rating']) ->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()を参照してください。
地理空間操作を使用したロケーションの一致
このセクションの例では、クエリ ビルダの構文を使用して 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()
クエリ ビルダ メソッドは、操作によって更新または挿入されたドキュメントの数を返します。
数値の増加の例
次の例は、 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()
クエリ ビルダ メソッドは、操作によって更新されたドキュメントの数を返します。