書込み操作
項目一覧
Overview
このガイドでは、Lambda MongoDB を使用して MongoDB コレクションに対して書込み操作を実行する方法を学習できます。 書込み操作には、指定された基準に基づいてデータの挿入、更新、および削除が含まれます。
このガイドでは、次のタスクを実行する方法について説明します。
サンプル モデル
このガイドの書込み (write) 操作は、次の Eloqueent モデル クラスを参照します。
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; class Concert extends Model { protected $connection = 'mongodb'; protected $fillable = ['performer', 'venue', 'genres', 'ticketsSold', 'performanceDate']; protected $casts = ['performanceDate' => 'datetime']; }
Tip
$fillable
属性を使用すると、挿入操作に Lambda の一括割り当てを使用できます。 メソッド クラスの割り当ての詳細については、 モデル クラスのドキュメントのがカスタマイズする を参照してください。
$casts
属性は、属性を一般的なデータ型に変換するように Lambel に指示します。詳細については、Lambel ドキュメントの「 属性キャスティング 」を参照してください。
ドキュメントの挿入
このセクションでは、Lambda MongoDB を使用して、Lambel アプリケーションから MongoDB コレクションにドキュメントを挿入する方法を学習できます。
ドキュメントを挿入するときは、データがコレクションの一意のインデックスに違反していないことを確認してください。 コレクションの最初のドキュメントを挿入するとき、または新しいコレクションを作成するときに、MongoDB は_id
フィールドに一意のインデックスを自動的に作成します。
Lambda スキーマ ビルダを使用して MongoDB コレクションにインデックスを作成する方法の詳細については、スキーマ ビルダ ドキュメントの「インデックスの管理」セクションを参照してください。
Lalavel 統合のEloquet モデルの詳細については、「 Elastic モデル 」セクションを参照してください。
ドキュメントの挿入の例
これらの例では、 save()
Eloqueent メソッドを使用して、 Concert
モデルのインスタンスを MongoDB ドキュメントとして挿入する方法を示します。
save()
メソッドが成功すると、 メソッドを呼び出したモデル インスタンスにアクセスできるようになります。
操作が失敗した場合、モデル インスタンスにはnull
が割り当てられます。
このサンプル コードでは、次のアクションが実行されます。
Concert
モデルの新しいインスタンスを作成しますフィールドと フィールドに string 値を割り当てます
performer
venue
文字列の配列を
genre
フィールドに割り当てますticketsSold
フィールドに数値を割り当てますCarbon
パッケージを使用してperformanceDate
フィールドに日付を割り当てますsave()
メソッドを呼び出してドキュメントを挿入
$concert = new Concert(); $concert->performer = 'Mitsuko Uchida'; $concert->venue = 'Carnegie Hall'; $concert->genres = ['classical']; $concert->ticketsSold = 2121; $concert->performanceDate = Carbon::create(2024, 4, 1, 20, 0, 0, 'EST'); $concert->save();
次のコード例に示すように、モデルのid
メンバーにアクセスすることで、挿入されたドキュメントの_id
値を検索できます。
$insertedId = $concert->id;
$fillable
または$guarded
属性のいずれかを定義して一括割り当てを有効にすると、次の例に示すように、Eloent モデルcreate()
メソッドを使用して 1 回の呼び出しで挿入を実行できます。
$insertResult = Concert::create([ 'performer' => 'The Rolling Stones', 'venue' => 'Soldier Field', 'genres' => [ 'rock', 'pop', 'blues' ], 'ticketsSold' => 59527, 'performanceDate' => Carbon::create(2024, 6, 30, 20, 0, 0, 'CDT'), ]);
PHPAPIを し てGithub 。 リポジトリ。
複数のドキュメントの挿入の例
この例では、 insert()
Eloqueent メソッドを使用して、 Concert
モデルの複数のインスタンスを MongoDB ドキュメントとして挿入する方法を示します。 この一括挿入メソッドにより、アプリケーションがドキュメントを保存するために必要な呼び出しの数が減ります。
insert()
メソッドが成功すると、値1
が返されます。
失敗した場合は、例外がスローされます。
このサンプル コードでは、1 回の呼び出しで複数のモデルを配列としてinsert()
メソッドに渡して、1 回の呼び出しで複数のモデルを保存します。
注意
この例では、日付を MongoDB\BSON\UTCDateTime でラップします クラスを使用して、 MongoDB がシリアル化できるタイプに変換する
$data = [ [ 'performer' => 'Brad Mehldau', 'venue' => 'Philharmonie de Paris', 'genres' => [ 'jazz', 'post-bop' ], 'ticketsSold' => 5745, 'performanceDate' => new UTCDateTime(Carbon::create(2025, 2, 12, 20, 0, 0, 'CET')), ], [ 'performer' => 'Billy Joel', 'venue' => 'Madison Square Garden', 'genres' => [ 'rock', 'soft rock', 'pop rock' ], 'ticketsSold' => 12852, 'performanceDate' => new UTCDateTime(Carbon::create(2025, 2, 12, 20, 0, 0, 'CET')), ], ]; Concert::insert($data);
ドキュメントの変更
このセクションでは、Lambda アプリケーションから MongoDB コレクション内のドキュメントを変更する方法を学習できます。 アップデート操作 を使用して既存のドキュメントを変更し、検索条件に一致するドキュメントがない場合はドキュメントを挿入します。
Eloquet モデルのインスタンスの変更を永続化するか、Eloquen の Fluent 構文を使用して Lambda コレクション オブジェクトを返すメソッドの更新操作を連鎖させることができます。
このセクションでは、次の更新操作の例を示します。
ドキュメントの更新例
ドキュメントは、次の方法で更新できます。
モデルのインスタンスを変更し、
save()
メソッドを呼び出して変更を保存します。モデルのインスタンスを取得し、
update()
メソッドを呼び出してアップデートを実行するためのメソッドのチェーン。
次の例では、モデルのインスタンスを変更し、そのsave()
メソッドを呼び出してドキュメントを更新する方法を示しています。
$concert = Concert::first(); $concert->venue = 'Manchester Arena'; $concert->ticketsSold = 9543; $concert->save();
save()
メソッドが成功すると、メソッドを呼び出したモデル インスタンスに更新された値が含まれます。
操作が失敗した場合、Laravel 統合はモデル インスタンスにnull
値を割り当てます。
次の例では、メソッドを連鎖させて最初に一致するドキュメントを検索してアップデートすることで、ドキュメントをアップデートする方法を示しています。
$concert = Concert::where(['performer' => 'Brad Mehldau']) ->orderBy('_id') ->first() ->update(['venue' => 'Manchester Arena', 'ticketsSold' => 9543]);
注意
orderBy()
呼び出しは、一貫したソート順序を保証するために、結果を_id
フィールドでソートします。 MongoDB でのソートの詳細については、サーバー マニュアルの「自然な順序」の用語集でのエントリを参照してください。
update()
メソッドが成功すると、操作は更新されたドキュメントの数を返します。
呼び出しの検索部分がどのドキュメントにも一致しない場合、Laravel 統合は次のエラーを返します。
Error: Call to a member function update() on null
複数のドキュメントの更新例
1 つ以上のドキュメントに対してアップデートを実行するには、 update()
メソッドを、ドキュメントを Lambda コレクション オブジェクトとして検索するメソッドの結果に連結します( where()
など)。
次の例は、呼び出しを連鎖させて一致するドキュメントを検索し、アップデートする方法を示しています。
Concert::whereIn('venue', ['Philharmonie de Paris', 'Soldier Field']) ->update(['venue' => 'Concertgebouw', 'ticketsSold' => 0]);
update()
メソッドが成功すると、操作は更新されたドキュメントの数を返します。
呼び出しの検索部分がコレクション内のどのドキュメントにも一致しない場合、Lambel 統合は次のエラーを返します。
Error: Call to a member function update() on null
1 回の操作で更新または挿入
アップサート操作を使用すると、1 回の操作で更新または挿入を実行できます。 この操作により、ドキュメントをアップデートしたり、ドキュメントが存在しない場合はドキュメントを挿入したりするタスクが効率化されます。
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()
メソッドでアップサートを指定するには、次のコード例に示すようにパラメーターを設定します。
YourModel::upsert( [/* documents to update or insert */], '/* unique field */', [/* fields to update */], );
例
この例では、 upsert()
メソッドを使用して、単一操作で更新または挿入を実行する方法を示します。 [ VIEW OUTPUTボタンをクリックして、 performer
の値が'Angel
Olsen'
であるドキュメントがすでにコレクション内にある場合は、結果によるデータの変更を確認します。
Concert::upsert([ ['performer' => 'Angel Olsen', 'venue' => 'Academy of Music', 'ticketsSold' => 275], ['performer' => 'Darondo', 'venue' => 'Cafe du Nord', 'ticketsSold' => 300], ], 'performer', ['ticketsSold']);
{ "_id": "...", "performer": "Angel Olsen", "venue": "State Theatre", "genres": [ "indie", "rock" ], "ticketsSold": 275, "updated_at": ... }, { "_id": "...", "performer": "Darondo", "venue": "Cafe du Nord", "ticketsSold": 300, "updated_at": ... }
performer
の値が'Angel
Olsen'
であるドキュメントでは、アップサートによってticketsSold
フィールドのみに更新が適用されることが指定されているため、 venue
フィールド値は更新されません。
更新方法
update()
メソッドでアップサートを指定するには、次のコード例に示すように、 upsert
オプションをtrue
に設定します。
YourModel::where(/* match criteria */) ->update( [/* update data */], ['upsert' => true]);
update()
メソッドがクエリに連結されると、次のいずれかのアクションが実行されます。
クエリが一致するドキュメントの場合、
update()
メソッドは一致するドキュメントを変更します。クエリが 0 のドキュメントと一致する場合、
update()
メソッドは 更新データと等価一致条件データを含むドキュメントを挿入します。
例
この例では、 upsert
オプションをupdate()
メソッドに渡して、単一操作でアップデートまたは挿入を実行する方法を示します。 一致するドキュメントが存在しない場合に挿入されたサンプル ドキュメントを確認するには、 VIEW OUTPUTボタンをクリックします。
Concert::where(['performer' => 'Jon Batiste', 'venue' => 'Radio City Music Hall']) ->update( ['genres' => ['R&B', 'soul'], 'ticketsSold' => 4000], ['upsert' => true], );
{ "_id": "660c...", "performer": "Jon Batiste", "venue": "Radio City Music Hall", "genres": [ "R&B", "soul" ], "ticketsSold": 4000, "updated_at": ... }
ドキュメント内の配列の更新
このセクションでは、MongoDB ドキュメント内の配列値を更新する次の操作の例を確認できます。
これらの例では、次の挿入操作によって作成されたサンプル ドキュメントを変更します。
Concert::create([ 'performer' => 'Mitsuko Uchida', 'genres' => ['classical', 'dance-pop'], ]);
配列への値の追加の例
このセクションでは、 push()
メソッドを使用して MongoDB ドキュメントの配列に値を追加する方法を説明します。 1 つ以上の値を渡して追加し、オプションのパラメータunique
をtrue
に設定すると、配列に重複する値の追加をスキップできます。 次のコード例は、 push()
メソッド呼び出しの構造を示しています。
YourModel::where(<match criteria>) ->push( <field name>, [<values>], // array or single value to add unique: true); // whether to skip existing values
次の例では、一致するドキュメントのgenres
配列フィールドに値"baroque"
を追加する方法を示しています。 更新されたドキュメントを確認するには、 VIEW OUTPUTボタンをクリックします。
Concert::where('performer', 'Mitsuko Uchida') ->push( 'genres', ['baroque'], );
{ "_id": "660eb...", "performer": "Mitsuko Uchida", "genres": [ "classical", "dance-pop", ], "updated_at": ..., "created_at": ... }
配列からの値の削除の例
このセクションでは、 pull()
メソッドを使用して MongoDB ドキュメント内の配列から値を削除する方法を説明します。 1 つ以上の値を渡して、配列から削除できます。 次のコード例は、 pull()
メソッド呼び出しの構造を示しています。
YourModel::where(<match criteria>) ->pull( <field name>, [<values>]); // array or single value to remove
次の例は、 genres
配列フィールドから配列値"classical"
と"dance-pop"
を削除する方法を示しています。 更新されたドキュメントを確認するには、 VIEW OUTPUTボタンをクリックします。
Concert::where('performer', 'Mitsuko Uchida') ->pull( 'genres', ['dance-pop', 'classical'], );
{ "_id": "660e...", "performer": "Mitsuko Uchida", "genres": [], "updated_at": ..., "created_at": ... }
配列要素の値を更新する例
このセクションでは、 $
位置演算子を使用して MongoDB ドキュメント内の特定の配列要素を更新する方法を説明します。 $
演算子は、クエリに一致する最初の配列要素を表します。 次のコード例は、一致する単一ドキュメントでの位置演算子アップデート呼び出しの構造を示しています。
注意
現在、Lambda 統合では、この操作はDB
ファサードでのみ提供されており、Eloquet ORM では提供されていません。
DB::connection('mongodb') ->getCollection(<collection name>) ->updateOne( <match criteria>, ['$set' => ['<array field>.$' => <replacement value>]]);
次の例では、配列値"dance-pop"
をgenres
配列フィールド内の"contemporary"
に置き換える方法を示しています。 更新されたドキュメントを確認するには、 VIEW OUTPUTボタンをクリックします。
$match = ['performer' => 'Mitsuko Uchida', 'genres' => 'dance-pop']; $update = ['$set' => ['genres.$' => 'contemporary']]; DB::connection('mongodb') ->getCollection('concerts') ->updateOne($match, $update);
{ "_id": "660e...", "performer": "Mitsuko Uchida", "genres": [ "classical", "contemporary" ], "updated_at": ..., "created_at": ... }
配列更新演算子の詳細については、サーバー マニュアルの「配列更新演算子 」を参照してください。
Delete Documents
このセクションでは、Lambda 統合を使用して MongoDB コレクションからドキュメントを削除する方法を学びます。 削除操作を使用して、MongoDB database からデータを削除します。
このセクションでは、次の削除操作の例を示します。
Lambel 統合で使用可能な削除動作を変更する Lambel 機能の詳細については、次のセクションを参照してください。
ドキュメントの削除の例
次の方法で 1 つのドキュメントを削除できます。
モデルのインスタンスで
$model->delete()
メソッドを呼び出します。削除するドキュメントの ID を渡して、モデルで
Model::destroy($id)
メソッドを呼び出します。delete()
メソッドを呼び出して、モデルの インスタンスを検索して削除するためのメソッドのチェーン。
次の例では、 モデルのインスタンスで$model->delete()
を呼び出してドキュメントを削除する方法を示しています。
$concert = Concert::first(); $concert->delete();
delete()
メソッドが成功すると、操作は削除されたドキュメントの数を返します。
呼び出しの検索部分がコレクション内のどのドキュメントにも一致しない場合、操作は0
を返します。
次の例では、ID の値をModel::destroy($id)
メソッドに渡してドキュメントを削除する方法を示しています。
$id = 'MSG-0212252000'; Concert::destroy($id);
destroy()
メソッドが成功すると、削除されたドキュメントの数が返されます。
ID の値がどのドキュメントにも一致しない場合、 destroy()
メソッドは0
を返します。
次の例は、呼び出しを連鎖させて最初に一致するドキュメントを検索して削除する方法を示しています。
Concert::where('venue', 'Carnegie Hall') ->limit(1) ->delete();
注意
orderBy()
呼び出しは、一貫したソート順序を保証するために、結果を_id
フィールドでソートします。 MongoDB でのソートの詳細については、サーバー マニュアルの「自然な順序」の用語集でのエントリを参照してください。
delete()
メソッドが成功すると、削除されたドキュメントの数が返されます。
where()
メソッドがどのドキュメントにも一致しない場合、 delete()
メソッドは0
を返します。
複数のドキュメントの削除の例
複数のドキュメントを次の方法で削除できます。
削除するドキュメントまたはモデル インスタンスの ID のリストを渡して、
Model::destroy($ids)
メソッドを呼び出します。メソッドをチェーンして、複数のオブジェクトを参照する Lambda コレクション オブジェクトを取得し、
delete()
メソッドを呼び出してそれらを削除します。
次の例では、 $ids
で表される ID 値の配列をdestroy()
メソッドに渡してドキュメントを削除する方法を示しています。
$ids = [3, 5, 7, 9]; Concert::destroy($ids);
Tip
大きなリストを渡されると、 destroy()
メソッドのパフォーマンスが低下します。 パフォーマンスを向上させるには、代わりにModel::whereIn('id', $ids)->delete()
を使用してください。
destroy()
メソッドが成功すると、削除されたドキュメントの数が返されます。
ID の値がどのドキュメントにも一致しない場合、 destroy()
メソッドは0
を返します。
次の例は、呼び出しを連鎖させて一致するドキュメントを検索して削除する方法を示しています。
Concert::where('ticketsSold', '>', 7500) ->delete();
delete()
メソッドが成功すると、削除されたドキュメントの数が返されます。
where()
メソッドがどのドキュメントにも一致しない場合、 delete()
メソッドは0
を返します。