Docs Menu
Docs Home
/ / /
Lambda MongoDB
/

書込み操作

項目一覧

  • Overview
  • サンプル モデル
  • ドキュメントの挿入
  • ドキュメントの挿入の例
  • 複数のドキュメントの挿入の例
  • ドキュメントの変更
  • ドキュメントの更新例
  • 複数のドキュメントの更新例
  • 1 回の操作で更新または挿入
  • アップサートの方法
  • 更新方法
  • ドキュメント内の配列の更新
  • 配列への値の追加の例
  • 配列からの値の削除の例
  • 配列要素の値を更新する例
  • Delete Documents
  • ドキュメントの削除の例
  • 複数のドキュメントの削除の例

このガイドでは、Lambda MongoDB を使用して MongoDB コレクションに対して書込み操作を実行する方法を学習できます。 書込み操作には、指定された基準に基づいてデータの挿入、更新、および削除が含まれます。

このガイドでは、次のタスクを実行する方法について説明します。

  • ドキュメントの挿入

  • ドキュメントの変更

  • Delete Documents

このガイドの書込み (write) 操作は、次の Eloqueent モデル クラスを参照します。

Concern.html
<?php
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 値を割り当てますperformervenue

  • 文字列の配列をgenreフィールドに割り当てます

  • ticketsSoldフィールドに数値を割り当てます

  • Carbonパッケージを使用してperformanceDateフィールドに日付を割り当てます

  • save()メソッドを呼び出してドキュメントを挿入

インスタンスで 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()メソッドを呼び出してドキュメントを更新する方法を示しています。

インスタンスで Save() メソッドを呼び出してドキュメントを更新します。
$concert = Concert::first();
$concert->venue = 'Manchester Arena';
$concert->ticketsSold = 9543;
$concert->save();

save()メソッドが成功すると、メソッドを呼び出したモデル インスタンスに更新された値が含まれます。

操作が失敗した場合、Laravel 統合はモデル インスタンスにnull値を割り当てます。

次の例では、メソッドを連鎖させて最初に一致するドキュメントを検索してアップデートすることで、ドキュメントをアップデートする方法を示しています。

update() メソッドを連鎖させて、一致するドキュメントをアップデートします。
$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 回の操作で更新または挿入を実行できます。 この操作により、ドキュメントをアップデートしたり、ドキュメントが存在しない場合はドキュメントを挿入したりするタスクが効率化されます。

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 つ以上の値を渡して追加し、オプションのパラメータuniquetrueに設定すると、配列に重複する値の追加をスキップできます。 次のコード例は、 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": ...
}

配列更新演算子の詳細については、サーバー マニュアルの「配列更新演算子 」を参照してください。

このセクションでは、Lambda 統合を使用して MongoDB コレクションからドキュメントを削除する方法を学びます。 削除操作を使用して、MongoDB database からデータを削除します。

このセクションでは、次の削除操作の例を示します。

Lambel 統合で使用可能な削除動作を変更する Lambel 機能の詳細については、次のセクションを参照してください。

  • ソフト削除。ドキュメントをデータベースから削除するのではなく、削除としてマークできます

  • プルーニング。ドキュメントを自動削除の対象となる条件を定義できます

次の方法で 1 つのドキュメントを削除できます。

  • モデルのインスタンスで$model->delete()メソッドを呼び出します。

  • 削除するドキュメントの ID を渡して、モデルでModel::destroy($id)メソッドを呼び出します。

  • delete()メソッドを呼び出して、モデルの インスタンスを検索して削除するためのメソッドのチェーン。

次の例では、 モデルのインスタンスで$model->delete()を呼び出してドキュメントを削除する方法を示しています。

インスタンスで delete() メソッドを呼び出してドキュメントを削除します。
$concert = Concert::first();
$concert->delete();

delete()メソッドが成功すると、操作は削除されたドキュメントの数を返します。

呼び出しの検索部分がコレクション内のどのドキュメントにも一致しない場合、操作は0を返します。

次の例では、ID の値をModel::destroy($id)メソッドに渡してドキュメントを削除する方法を示しています。

ID 値でドキュメントを削除します。
$id = 'MSG-0212252000';
Concert::destroy($id);

destroy()メソッドが成功すると、削除されたドキュメントの数が返されます。

ID の値がどのドキュメントにも一致しない場合、 destroy()メソッドは0を返します。

次の例は、呼び出しを連鎖させて最初に一致するドキュメントを検索して削除する方法を示しています。

delete() メソッドを連鎖させて、一致するドキュメントを削除します。
Concert::where('venue', 'Carnegie Hall')
->limit(1)
->delete();

注意

orderBy()呼び出しは、一貫したソート順序を保証するために、結果を_idフィールドでソートします。 MongoDB でのソートの詳細については、サーバー マニュアルの「自然な順序」の用語集でのエントリを参照してください。

delete()メソッドが成功すると、削除されたドキュメントの数が返されます。

where()メソッドがどのドキュメントにも一致しない場合、 delete()メソッドは0を返します。

複数のドキュメントを次の方法で削除できます。

  • 削除するドキュメントまたはモデル インスタンスの ID のリストを渡して、 Model::destroy($ids)メソッドを呼び出します。

  • メソッドをチェーンして、複数のオブジェクトを参照する Lambda コレクション オブジェクトを取得し、 delete()メソッドを呼び出してそれらを削除します。

次の例では、 $idsで表される ID 値の配列をdestroy()メソッドに渡してドキュメントを削除する方法を示しています。

ID でドキュメントを削除します。
$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を返します。

戻る

読み取り操作