문서 수정
개요
이 가이드 에서는 Laravel MongoDB 사용하여 Laravel 애플리케이션 에서 MongoDB 컬렉션 의 문서를 수정하는 방법을 학습 수 있습니다. 업데이트 작업을 사용하여 기존 문서를 수정하거나 검색 기준과 일치하는 문서가 없는 경우 문서 를 삽입합니다.
Eloquent 모델의 인스턴스에 변경 사항을 유지하거나 Eloquent의 유창한 구문을 사용하여 Laravel 컬렉션 객체를 반환하는 메서드에 대한 업데이트 작업을 연결할 수 있습니다.
이 가이드 다음과 같은 업데이트 작업의 예를 제공합니다.
샘플 모델
이 가이드 의 작업은 다음 Eloquent 모델 클래스를 참조합니다:
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']; }
팁
$fillable
속성을 사용하면 삽입 작업에 Laravel 대량 할당을 사용할 수 있습니다. 대량 할당에 학습 보려면 Eloquent 모델 클래스 문서에서 Customize Mass Assignment (대량 할당 사용자 지정)를 참조하세요.
$casts
속성은 속성을 일반적인 데이터 유형으로 변환하도록 Laravel에 지시합니다. 학습 내용은 Laravel 문서에서 속성 캐스팅 을(를) 참조하세요.
하나의 문서 업데이트
다음과 같은 방법으로 문서를 업데이트할 수 있습니다.
모델의 인스턴스를 수정하고
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 정렬에 대해 자세히 알아보려면 MongoDB 서버 매뉴얼의 기본 순서 용어집 항목을 참조하세요.
update()
메서드가 성공하면 작업이 업데이트된 문서 수를 반환합니다.
호출의 조회 부분이 어떤 문서와도 일치하지 않는 경우 Laravel 통합은 다음 오류를 반환합니다.
Error: Call to a member function update() on null
여러 문서 업데이트하기
하나 이상의 문서에서 업데이트를 수행하려면 where()
와 같이 문서를 Laravel 컬렉션 객체로 조회하는 메서드의 결과에 update()
메서드를 연결합니다.
다음 예는 일치하는 문서를 검색하고 업데이트하기 위해 호출을 연결하는 방법을 보여줍니다.
Concert::whereIn('venue', ['Philharmonie de Paris', 'Soldier Field']) ->update(['venue' => 'Concertgebouw', 'ticketsSold' => 0]);
update()
메서드가 성공하면 작업이 업데이트된 문서 수를 반환합니다.
호출의 조회 부분이 컬렉션 의 어떤 문서와도 일치하지 않으면 Laravel 통합은 다음 오류를 반환합니다.
Error: Call to a member function update() on null
한 번의 작업으로 업데이트 또는 삽입
업서트 작업을 사용하면 한 번의 작업으로 업데이트 또는 삽입을 수행할 수 있습니다. 이 작업은 문서를 업데이트하거나 문서가 없는 경우 문서를 삽입하는 작업을 간소화합니다.
v4.7 부터 시작됩니다. 다음 방법 중 하나를 사용하여 업서트 작업을 수행할 수 있습니다.
upsert()
: 이 방법을 사용하면 배치 업서트 를 수행하여 한 번의 작업으로 여러 문서를 변경하거나 삽입할 수 있습니다.update()
: 이 메서드를 사용하는 경우 쿼리 필터하다 와 일치하는 모든 문서를 업데이트 하거나 일치하는 문서 를 삽입하려면upsert
옵션을 지정해야 합니다. 이 업서트 메서드만 v4.6 이전 버전에서 지원됩니다.
Upsert 메서드
upsert()
메서드는 다음 매개 변수를 허용합니다:
$values
: 업데이트 하거나 삽입할 문서를 지정하는 필드 및 값의 배열입니다.$uniqueBy
: 첫 번째 배열 매개변수에서 문서를 고유하게 식별하는 하나 이상의 필드입니다.$update
: 일치하는 문서 있는 경우 업데이트 필드의 선택적 배열 . 이 매개변수를 생략하면 Laravel 통합이 모든 필드를 업데이트합니다.
upsert()
메서드에서 업서트 지정하려면 다음 코드 예시 와 같이 필수 매개변수를 전달합니다.
YourModel::upsert( [/* documents to update or insert */], '/* unique field */', [/* fields to update */], );
예시
이 예시 에서는 upsert()
메서드를 사용하여 단일 작업으로 업데이트 또는 삽입을 수행하는 방법을 보여 줍니다. 컬렉션 에 이미 performer
값이 'Angel
Olsen'
인 문서 가 있는 경우 VIEW OUTPUT 버튼을 클릭하여 결과 데이터 변경 사항을 확인합니다.
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 문서의 배열에 값을 추가하는 방법을 보여 줍니다. 추가할 값을 하나 이상 전달하고 선택적 매개변수 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 문서의 배열에서 값을 제거하는 방법을 보여 줍니다. 배열에서 제거할 값을 하나 이상 전달할 수 있습니다. 다음 코드 예시에서는 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 문서에서 특정 배열 요소를 업데이트하는 방법을 보여줍니다. $
연산자는 쿼리와 일치하는 첫 번째 배열 요소를 나타냅니다. 다음 코드 예시에서는 일치하는 단일 문서에 대한 위치 연산자 업데이트 호출의 구조를 보여줍니다.
참고
현재 Laravel 통합은 이 작업을 DB
파사드에서만 제공하며 Eloquent ORM에서는 제공하지 않습니다.
DB::connection('mongodb') ->getCollection(<collection name>) ->updateOne( <match criteria>, ['$set' => ['<array field>.$' => <replacement value>]]);
다음 예에서는 genres
배열 필드에서 배열 값 "dance-pop"
을 "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": ... }
배열 업데이트 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 배열 업데이트 연산자를 참조하세요.
추가 정보
Laravel 통합을 사용하여 문서를 업데이트 방법을 보여주는 실행 가능한 코드 예제를 보려면 다음 사용 예제를 참조하세요.
MongoDB 컬렉션 에 문서를 삽입하는 방법을 학습 문서 삽입 가이드 참조하세요.