Docs Menu

ドキュメントの変更

このガイドでは、Lambda MongoDBを使用して、LambelアプリケーションからMongoDBコレクション内のドキュメントを変更する方法を学習できます。アップデート操作 を使用して既存のドキュメントを変更し、検索条件に一致するドキュメントがない場合はドキュメントを挿入します。

Eloquet モデルのインスタンスの変更を永続化するか、Eloquen の Fluent 構文を使用して Lambda コレクション オブジェクトを返すメソッドの更新操作を連鎖させることができます。

このガイドでは、次の更新操作の例を示します。

このガイドの操作は、次の Elastic モデルクラス を参照。

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 ドキュメントの「 属性キャスティング 」を参照してください。

ドキュメントは、次の方法で更新できます。

  • モデルのインスタンスを変更し、 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 回の操作で更新または挿入を実行できます。 この操作により、ドキュメントをアップデートしたり、ドキュメントが存在しない場合はドキュメントを挿入したりするタスクが効率化されます。

v 4.7以降、 次のいずれかの方法を使用して、アップサート操作を実行できます。

  • upsert(): このメソッドを使用すると、バッチ アップサートを実行して 1 回の操作で複数のドキュメントを変更または挿入できます。

  • update(): このメソッドを使用する場合、クエリフィルターに一致するすべてのドキュメントを更新するか、一致するドキュメントがない場合は 1 つのドキュメントを挿入するために、 upsertオプションを指定する必要があります。 このアップサート メソッドのみが v 4.6以前のバージョンではサポートされています。

upsert() メソッドは次のパラメーターを受け入れます:

  • $values: 更新または挿入するドキュメントを指定するフィールドと値の配列。

  • $uniqueBy: 最初の配列パラメータでドキュメントを一意に識別する 1 つ以上のフィールド。

  • $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コレクションにドキュメントを挿入する方法については、 「ドキュメントの挿入」ガイドを参照してください。