정의
updateupdate명령은 컬렉션의 문서를 수정합니다. 단일update명령에는 여러 개의 업데이트 문이 포함될 수 있습니다.팁
mongosh에서 이 명령은updateOne(),updateMany(),replaceOne(),findOneAndReplace()및findOneAndUpdate()헬퍼 메서드를 통해서도 실행 수 있습니다.헬퍼 메서드는
mongosh사용자에게 편리하지만 데이터베이스 명령과 동일한 수준의 정보를 반환하지 못할 수 있습니다. 편의가 필요하지 않거나 추가 리턴 필드가 필요한 경우 데이터베이스 명령을 사용합니다.
호환성
이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
참고
이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 관해 자세히 알아보려면 지원되지 않는 명령을 참조하십시오.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
버전 5.0에서 변경됨
명령은 다음과 같은 구문을 가집니다:
db.runCommand( { update: <collection>, updates: [ { q: <query>, u: <document or pipeline>, c: <document>, // Added in MongoDB 5.0 upsert: <boolean>, multi: <boolean>, collation: <document>, arrayFilters: <array>, hint: <document|string> }, ... ], ordered: <boolean>, maxTimeMS: <integer>, writeConcern: { <write concern> }, bypassDocumentValidation: <boolean>, comment: <any>, let: <document> // Added in MongoDB 5.0 } )
명령 필드
이 명령은 다음 필드를 사용합니다.
필드 | 유형 | 설명 | |||||
|---|---|---|---|---|---|---|---|
| 문자열 | 대상 컬렉션의 이름입니다. | |||||
| 배열 | 명명된 컬렉션 에서 수행할 하나 이상의 업데이트 문의 배열 . 업데이트 문에 대한 자세한 내용은 업데이트 문을 참조하세요. | |||||
| 부울 | 선택 사항입니다. | |||||
| non-negative integer | 선택 사항. 시간 제한을 밀리초 단위로 지정합니다. MongoDB는 | |||||
| 문서 | 선택 사항. 명령의 쓰기 고려 트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요. | |||||
| 부울 | 선택 사항입니다. | |||||
| any | 선택 사항. 이 명령에 첨부할 사용자 제공 코멘트입니다. 설정되면 이 설명은 다음 위치에서 이 명령의 레코드와 함께 표시됩니다.
댓글은 유효한 모든 BSON types (문자열, 정수, 객체, 배열 등)이 될 수 있습니다. | |||||
문서 | 선택 사항. 변수 목록이 있는 문서를 지정합니다. 이를 통해 쿼리 텍스트에서 변수를 분리하여 명령 가독성을 향상시킬 수 있습니다. 문서 구문은 다음과 같습니다: 변수는 표현식에서 반환된 값으로 설정되며 이후에는 변경할 수 없습니다. 명령에서 변수 값에 액세스하려면 전체 예시 는 옵션 버전 5.0에 추가. |
업데이트 문
updates 배열의 각 요소는 업데이트 문 문서입니다. 각 문서에는 다음과 같은 필드가 포함되어 있습니다.
필드 | 유형 | 설명 | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
문서 | ||||||||||||||||||||
문서 또는 파이프라인 | 수정 사항을 적용합니다. 값은 다음 중 하나일 수 있습니다.
자세한 내용은 동작을 참조하세요. | |||||||||||||||||||
문서 | 선택 사항. u가 파이프라인 인 경우에만 를 지정할 수 있습니다. 변수 목록이 있는 문서를 지정합니다. 이를 통해 쿼리 텍스트에서 변수를 분리하여 명령 가독성을 향상시킬 수 있습니다. 문서 구문은 다음과 같습니다: 변수는 표현식에서 반환된 값으로 설정되며 이후에는 변경할 수 없습니다. 명령에서 변수 값에 액세스하려면 변수를 사용하여 결과를 필터링하려면 및 변수를 사용하는 전체 예시 버전 5.0에 추가. | |||||||||||||||||||
부울 | 선택 사항.
업서트가 여러 번 기본값은 | |||||||||||||||||||
| 부울 | 선택 사항입니다. 여러 문서를 업데이트할 때 단일 문서 업데이트 에 실패하면 추가 문서가 업데이트되지 않습니다. 이 동작에 대한 자세한 내용은 다중 업데이트 실패를 참조하세요. | ||||||||||||||||||
| 문서 | 선택 사항. 작업에 사용할 데이터 정렬을 지정합니다. 데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다. 데이터 정렬 옵션의 구문은 다음과 같습니다: 데이터 정렬을 지정할 때 데이터 정렬이 지정되지 않았지만 컬렉션에 기본 데이터 정렬이 있는 경우( 컬렉션 또는 연산에 대한 데이터 정렬이 지정되지 않은 경우, MongoDB는 이전 버전에서 문자열 비교에 사용된 간단한 이진 비교를 사용합니다. 한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다. | ||||||||||||||||||
| 배열 | 선택 사항. 필터 문서의 배열로, 배열 필드에서의 업데이트 작업을 위해 수정할 배열 요소를 결정합니다. 업데이트 문서에서
업데이트 문서에 동일한 식별자를 여러 번 포함할 수 있지만, 업데이트 문서의 각 고유 식별자( 그러나 다음 예시와 같이 단일 필터 문서에서 동일한 식별자에 복합 조건을 지정할 수 있습니다. | ||||||||||||||||||
문서 또는 문자열 | 선택 사항. 쿼리 조건자를 지원 데 사용할 인덱스지정하는 문서 또는 문자열입니다. 이 옵션은 인덱스 사양 문서 또는 인덱스 이름 문자열을 사용할 수 있습니다. 존재하지 않는 인덱스를 지정하면 연산 오류가 발생합니다. |
반환
이 명령은 작업 상태가 포함된 문서를 반환합니다. 예시:
{ "ok" : 1, "nModified" : 0, "n" : 1, "upserted" : [ { "index" : 0, "_id" : ObjectId("52ccb2118908ccd753d65882") } ] }
출력 필드에 대한 자세한 내용은 출력을 참조하세요.
액세스 제어
authorization으로 실행되는 배포에서 사용자에게 다음 권한이 포함된 액세스 권한이 있어야 합니다.
기본 제공 역할 readWrite은 이러한 권한을 제공합니다.
행동
제한 사항
multi: true를 설정한 경우 update 명령은 멱등 작업에만 사용하세요.
업데이트 연산자 표현식 문서가 포함된 업데이트
업데이트 문 필드 u는 업데이트 연산자 표현식만 포함된 문서를 허용할 수 있습니다. 예시:
updates: [ { q: <query>, u: { $set: { status: "D" }, $inc: { quantity: 2 } }, ... }, ... ]
그런 다음 update 명령은 문서에서 해당 필드만 업데이트합니다.
대체 문서로 업데이트
업데이트 문 필드 u 필드는 교체 문서(예시: 문서에 field:value 표현식만 포함된 문서)를 허용할 수 있습니다. 예를 들면 다음과 같습니다.
updates: [ { q: <query>, u: { status: "D", quantity: 4 }, ... }, ... ]
그런 다음 update 명령은 일치하는 문서를 업데이트 문서로 바꿉니다. update 명령은 일치하는 단일 문서만 바꿀 수 있습니다. 즉, multi 필드는 true 일 수 없습니다. update 명령은 _id 값을 대체하지 않습니다.
다중 업데이트 실패
multi 매개변수가 true로 설정된 업데이트 명령에서 단일 문서가 업데이트되지 않으면 해당 명령의 일부로 추가 문서가 업데이트되지 않습니다.
sample_mflix.movies 예시 들어 imdb.rating 컬렉션 필드가 있는 영화가 movies 포함되어 있습니다.imdb.rating 값이 보다 작거나 같아야 한다는 규칙을 사용하여 컬렉션 에 문서 유효성 검사기를 만듭니다.10
db.runCommand( { update: "movies", updates: [ { q: { year: { $gte: 2000, $lte: 2005 }, "imdb.rating": { $type: "number" } }, u: { $inc: { "imdb.rating": 1 } }, multi: true } ] } )
이미 평점이 10인 영화가 있는 경우, 평점을 높이면 유효성 검사기 규칙(평점 > 10)을 위반하게 됩니다. 이 경우 수천 개의 문서가 쿼리 와 일치하더라도 업데이트 가 중지되고 추가 문서가 업데이트되지 않습니다.
참고
일부 문서가 스키마 유효성 검사에 실패하는 경우와 같이 일치하는 문서의 하위 집합이 업데이트되는 경우 update 명령에서 반환되는 nModified 값이 정확하지 않을 수 있습니다.
집계 파이프라인으로 업데이트하기
업데이트 문 필드 u 필드는 수행할 수정 사항을 지정하는 집계 파이프라인 [ <stage1>, <stage2>, ... ]를 수락할 수 있습니다. 파이프라인은 다음 단계로 구성될 수 있습니다.
$addFields및 그 별칭$set$replaceRoot및 그 별칭$replaceWith
집계 파이프라인e을 사용하면 현재 필드 값을 기반으로 조건부 업데이트를 표현하거나 다른 필드의 값을 사용하여 한 필드를 업데이트하는 등 보다 표현력이 풍부한 업데이트 구문을 작성할 수 있습니다.
예를 들면 다음과 같습니다.
updates: [ { q: <query>, u: [ { $set: { status: "Modified", comments: [ "$misc1", "$misc2" ] } }, { $unset: [ "misc1", "misc2" ] } ], ... }, ... ]
예시는 집계 파이프라인으로 업데이트를 참조하세요.
고유 인덱스가 포함된 업서트
중복을 방지하는 고유 인덱스 가 없는 경우 업서트는 중복 문서를 생성할 수 있습니다.
이름이 Andy인 문서가 없고 여러 클라이언트가 대략 동시에 다음 명령을 실행하는 예시를 가정해 보겠습니다.
db.runCommand( { update: "people", updates: [ { q: { name: "Andy" }, u: { $inc: { score: 1 } }, multi: true, upsert: true } ] } )
클라이언트가 데이터를 성공적으로 삽입하기 전에 모든 update 연산에서 쿼리 단계가 완료되었으며 name 필드에 고유 인덱스가 없는 경우 각 update 연산에서 삽입이 발생하여 name: Andy가 포함된 문서가 여러 개 생성될 수 있습니다.
name 필드의 고유 인덱스는 문서가 하나만 생성되도록 합니다. 이 고유 인덱스가 적용되면 이제 여러 update 연산이 다음과 같은 동작을 나타냅니다.
정확히 하나의
update작업으로 새 문서가 성공적으로 삽입됩니다.다른
update작업은 새로 삽입된 문서를 업데이트하거나 고유 키 충돌로 인해 실패합니다.다른
update작업을 통해 새로 삽입한 문서를 업데이트하려면 다음 조건을 모두 충족해야 합니다.target collection에 중복 키 오류를 일으킬 수 있는 고유 인덱스가 있습니다.
업데이트 작업이
updateMany이 아니거나multi이false입니다.업데이트 일치 조건은 둘 중 하나입니다:
단일 동등성 조건자. 예를 들면 다음과 같습니다.
{ "fieldA" : "valueA" }동등성 조건자의 논리적 AND. 예를 들면 다음과 같습니다.
{ "fieldA" : "valueA", "fieldB" : "valueB" }
동등성 조건자의 필드는 고유 인덱스 키 패턴의 필드와 일치합니다.
업데이트 작업은 고유 인덱스 키 패턴의 필드를 수정하지 않습니다.
다음 표는 키 충돌이 발생하면 업데이트를 초래하거나 실패하는 upsert 작업의 예를 보여줍니다.
고유 인덱스 키 패턴 | 업데이트 작업 | 결과 | ||||||
|---|---|---|---|---|---|---|---|---|
| | 일치하는 문서의 | ||||||
| | 고유 인덱스 키 패턴( | ||||||
| | 동등성 조건자 필드( |
제한
updates 배열의 각 update 요소에 대해 쿼리와 업데이트 크기의 합계(즉, q 및 u)는 최대 BSON 문서 크기보다 작거나 같아야 합니다.
updates 배열의 총 업데이트 문 수는 최대 대량 크기 이하여야 합니다.
스키마 유효성 검사
update 명령은 유효성 검사 규칙이 있는 컬렉션에 문서를 삽입하거나 업데이트할 때 스키마 유효성 검사를 우회할 수 있는 bypassDocumentValidation 옵션에 대한 지원을 추가합니다.
샤드 컬렉션
upsert 샤드 컬렉션에서
샤딩된 컬렉션에서 multi: false와 함께 update를 사용하려면
upsert: true를 지정하지 않으면 필터 q는
_id필드에 동등성 매치를 포함하거나 단일 샤드를 대상으로 지정해야 합니다(예: 샤드 키 포함).upsert: true를 지정하는 경우, 필터 q에 샤드 키에 대한 동등성 매치가 포함되어야 합니다.
그러나 샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락될 수 있습니다. 샤드 키가 누락된 문서를 대상으로 하려면
null동등성 매치를 다른 필터 조건(예:_id필드)과 함께 사용할 수 있습니다. 예를 들면 다음과 같습니다.{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
문서 교체
문서를 교체할 때 update는 쿼리 필터를 사용하여 먼저 샤드를 대상으로 삼으려고 시도합니다. 작업이 쿼리 필터로 단일 샤드를 대상으로 지정할 수 없는 경우 대체 문서로 대상을 지정하려고 시도합니다.
샤드 키 수정
샤드 키 필드가 변경할 수 없는 _id 필드가 아닌 경우 문서의 샤드 키 값을 업데이트할 수 있습니다.
기존 샤드 키 값을 update으로 수정하려면 다음을 수행합니다.
반드시
mongos에서 실행해야 합니다. 샤드에서 직접 작업을 실행하지 않아야 합니다.반드시
multi: false를 지정해야 합니다.전체 샤드 키에 동등 쿼리 필터를 포함해야 합니다.
팁
누락된 키 값은 null 동등성 매치의 일부로 반환되므로 null 값 키가 업데이트되지 않도록 하려면 추가 쿼리 조건(예: _id 필드)을 적절히 포함하세요.
샤딩된 컬렉션에서 upsert도 참조하세요.
누락된 샤드 키
샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락될 수 있습니다. update를 사용하여 문서의 누락된 샤드 키를 설정하려면 mongos에서 실행해야 합니다. 샤드에서 바로 연산을 실행하지는 마세요.
또한 다음 요구 사항도 적용됩니다.
작업 | 요구 사항: |
|---|---|
설정 방법 |
|
|
팁
누락된 키 값은 null 동등성 매치의 일부로 반환되므로 null 값 키가 업데이트되지 않도록 하려면 추가 쿼리 조건(예: _id 필드)을 적절히 포함하세요.
다음도 참조하세요.
트랜잭션
update는 분산 트랜잭션 내에서 사용할 수 있습니다.
중요
대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.
추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.
트랜잭션 내 업서트
트랜잭션이 교차 샤드 쓰기 트랜잭션(write transaction)이 아닌 경우 분산 트랜잭션 내에서 컬렉션과 인덱스를 생성할 수 있습니다.
upsert: true인 update는 기존 컬렉션이나 존재하지 않는 컬렉션에서 실행될 수 있습니다. 존재하지 않는 컬렉션에서 실행하면 작업이 컬렉션을 만듭니다.
쓰기 고려 및 트랜잭션
트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요.
예시
이 페이지의 예제에서는 sample_mflix 샘플 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB deployment 에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예제를 실행 하려면 데이터베이스를 삭제하고 다시 만들어야 할 수 있습니다.
한 문서의 특정 필드 업데이트
업데이트 연산자를 사용하여 문서의 지정된 필드만 업데이트합니다.
예시 들어 sample_mflix 데이터베이스 의 movies 컬렉션 에 있는 문서에는 title, year, num_mflix_comments 등의 필드가 포함되어 있습니다.
다음 명령은 $set 및 $inc 업데이트 연산자를 사용하여 title가 "The Godfather"과 같은 문서의 year 및 num_mflix_comments 필드를 업데이트합니다.
db.runCommand( { update: "movies", updates: [ { q: { title: "The Godfather" }, u: { $set: { year: 1972 }, $inc: { num_mflix_comments: 1 } } } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
<update> 문서는 선택적 multi 필드를 지정하지 않기 때문에 둘 이상의 문서가 q 일치 조건과 일치하더라도 업데이트는 하나의 문서만 수정합니다.
자세한 내용은 출력을 참조하세요.
여러 문서의 특정 필드 업데이트
업데이트 연산자를 사용하여 문서의 지정된 필드만 업데이트하고 true로 설정된 multi 필드를 업데이트 문에 포함합니다.
예시 들어 sample_mflix 데이터베이스 의 movies 컬렉션 에 있는 문서에는 year 및 num_mflix_comments와 같은 필드가 포함되어 있습니다.
다음 명령은 $inc 업데이트 연산자 사용하여 num_mflix_comments 에 개봉된 모든 영화에 대해 필드 1924 증가시킵니다.
db.runCommand( { update: "movies", updates: [ { q: { year: 1924 }, u: { $inc: { num_mflix_comments: 1 }, $set: { classic: true, era: "silent" } }, multi: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
multi 필드 true로 설정하다 있으므로 업데이트 q 필드 에 지정된 쿼리 와 일치하는 모든 6 문서를 수정하고 다음 출력을 반환합니다.
{ n: 6, nModified: 6, ok: 1 }
자세한 내용은 출력을 참조하세요.
집계 파이프라인으로 업데이트하기
update 명령은 업데이트에 집계 파이프라인을 사용할 수 있습니다. 파이프라인은 다음 단계로 구성될 수 있습니다.
$addFields및 그 별칭$set$replaceRoot및 그 별칭$replaceWith
집계 파이프라인e을 사용하면 현재 필드 값을 기반으로 조건부 업데이트를 표현하거나 다른 필드의 값을 사용하여 한 필드를 업데이트하는 등 보다 표현력이 풍부한 업데이트 구문을 작성할 수 있습니다.
예시 1
다음 예에서는 집계 파이프라인e을 사용하여 문서의 다른 필드 값을 사용하여 필드를 수정합니다.
sample_mflix 데이터베이스 의 users 컬렉션 에 있는 문서에는 name 및 email 등의 필드가 포함되어 있습니다.
다음 업데이트 작업은 집계 파이프라인 사용하여 특정 사용자의 문서 에 새 필드를 추가합니다.
db.runCommand( { update: "users", updates: [ { q: { name: "Robert Baratheon" }, u: [ { $set: { full_info: { $concat: [ "$name", " - ", "$email" ] } } }, { $set: { status: "active" } } ], multi: false } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
참고
$set 파이프라인 에 사용된 연산은 업데이트 연산자 가 $set $set 아닌 집계 단계 을(를) 참조합니다.
예시 2
집계 파이프라인e을 사용하면 업데이트에서 현재 필드 값을 기반으로 조건부 업데이트를 수행할 수 있을 뿐만 아니라 현재 필드 값을 사용하여 별도의 필드 값을 계산할 수도 있습니다.
sample_mflix 데이터베이스 의 movies 컬렉션 에 있는 문서에는 year 필드 있습니다.
다음 예시 집계 파이프라인 사용하여 '대열차 강도'의 연령을 계산하고 릴리스된 시점을 기준으로 연대 분류를 할당합니다.
db.runCommand( { update: "movies", updates: [ { q: { title: "The Great Train Robbery" }, u: [ { $set: { age: { $subtract: [ 2026, "$year" ] } } }, { $set: { era: { $switch: { branches: [ { case: { $lt: [ "$year", 1960 ] }, then: "Classic" }, { case: { $lt: [ "$year", 1980 ] }, then: "Golden Age" }, { case: { $lt: [ "$year", 2000 ] }, then: "Modern" }, { case: { $gte: [ "$year", 2000 ] }, then: "Contemporary" } ], default: "Unknown" } } } } ], multi: false } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
참고
파이프라인에 사용된 $set는 업데이트 연산자 $set가 아닌 집계 단계 $set를 참조합니다.
대량 업데이트
다음 예시 단일 명령으로 여러 업데이트 작업을 수행하여 기존 문서를 업데이트 하고 새 문서를 삽입합니다. 작업:
2015 의 높은 평점을 받은 공포 영화를 다음으로 표시합니다.
featured2012 의 단편 드라마 및 로맨스 영화를 다음과 같이 분류합니다.
melodrama2024 의 새 공상 과학 영화가 없는 경우 업서트
db.runCommand( { update: "movies", updates: [ // Update highly-rated Horror movies from 2015 { q: { year: 2015, genres: "Horror", "imdb.rating": { $gte: 7 } }, u: { $set: { featured: true } }, multi: true }, // Update short Drama/Romance movies from 2012 { q: { year: 2012, genres: { $all: ["Drama", "Romance"] }, runtime: { $lt: 90 } }, u: { $set: { category: "melodrama" } }, multi: true }, // Upsert a new movie from 2026 { q: { title: "A New Movie", year: 2026 }, u: { $set: { genres: ["Sci-Fi", "Adventure"], runtime: 142, "imdb.rating": 8.5, featured: true } }, upsert: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
반환된 문서 는 명령이 기존 문서를 수정하고 업서트 통해 새 문서 삽입했음을 보여줍니다.자세한 내용은 출력을 참조하세요.
{ n: 16, upserted: [ { index: 2, _id: ObjectId('69861e680e6ea1f51160fe1c') } ], nModified: 15, ok: 1, '...': '...' }
데이터 정렬 지정
데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.
sample_mflix 데이터베이스 의 movies 컬렉션 에 있는 문서에는 title 및 year와 같은 필드가 있습니다.
다음 작업은 데이터 정렬을 사용하여 대소문자를 구분하지 않는 검색 수행합니다. 쿼리 소문자로 "the godfather" 를 검색하지만 strength: 1 데이터 정렬을 사용하면 쿼리 문자에 관계없이 "The Godfather" 와 일치합니다.
db.runCommand({ update: "movies", updates: [ { q: { title: "the godfather" }, u: { $set: { featured: true } }, collation: { locale: "en", strength: 1 } } ] })
arrayFilters 배열 업데이트 작업에 지정
배열 필드를 업데이트할 때 업데이트할 배열 요소를 결정하는 arrayFilters를 지정할 수 있습니다.
arrayFilters 업데이트 요소가 기준과 일치
sample_mflix 데이터베이스 의 movies 컬렉션 에 있는 문서에는 languages 배열 필드 있습니다.
다음 예시 languages 배열 에 "English" 이 있는 모든 영화를 업데이트합니다. 이 작업은 "English" 를 "EN"로 바꿉니다.
db.runCommand( { update: "movies", updates: [ { q: { languages: "English" }, u: { $set: { "languages.$[element]" : "EN" } }, arrayFilters: [ { "element": "English" } ], multi: true} ] } )
문서 배열의 특정 요소 업데이트
sample_mflix 데이터베이스 의 movies 컬렉션 에 있는 문서에는 행위자 이름을 나열하는 cast 배열 있습니다.
다음 예시 cast 배열 에 "Al Pacino" 이 있는 모든 영화를 업데이트하고 "Al Pacino" 을 "REDACTED"로 바꿉니다. arrayFilters 옵션은 업데이트 할 배열 요소를 지정합니다.
db.runCommand({ update: "movies", updates: [ { q: { cast: "Al Pacino" }, u: { $set: { "cast.$[elem]" : "REDACTED" } }, arrayFilters: [ { "elem": "Al Pacino" } ], multi: true } ] })
이 작업은 cast 배열 에 "Al Pacino" 이 있는 모든 40 영화를 업데이트하고 그의 이름을 "REDACTED"로 바꿉니다.
업데이트 hint 작업에 지정
sample_mflix 데이터베이스 의 movies 컬렉션 에 있는 문서에는 year 및 num_mflix_comments와 같은 필드가 있습니다.
컬렉션에 다음 인덱스를 만듭니다.
[ db.movies.createIndex( { year: 1 } ), db.movies.createIndex( { num_mflix_comments: 1 } ) ]
다음 업데이트 작업은 '대열차 강도'에 대한 num_mflix_comments 필드 증가시키고 인덱스 { year: 1 }을 사용하도록 명시적으로 힌트합니다.
참고
존재하지 않는 인덱스를 지정하면 연산 오류가 발생합니다.
db.runCommand({ update: "movies", updates: [ { q: { title: "The Great Train Robbery" }, u: { $inc: { "num_mflix_comments": 1 } }, hint: { year: 1 }, multi: false } ] })
사용된 인덱스 확인하려면 업데이트 작업에서 를 실행 됩니다. 예시 를 들어 이후에 출시된 explain 댓글이 num_mflix_comments 개 이하인 영화에 대해 를 증가시키는 업데이트 에 대한 설명입니다.5 2000
db.runCommand( { explain: { update: "movies", updates: [ { q: { "num_mflix_comments": { $lte: 5 }, "year": { $gte: 2000 } }, u: { $inc: { "num_mflix_comments": 1 } }, hint: { year: 1 }, multi: true } ] }, verbosity: "queryPlanner" } )
explain은 문서를 수정하지 않습니다.
옵션 let 또는 필드에서 변수 사용 c
버전 5.0에 추가.
변수는 let 옵션 또는 c 필드에서 정의하고 updates 배열에서 액세스할 수 있습니다.
참고
변수를 사용하여 결과를 필터링하려면 $expr 연산자 내에서 변수에 액세스해야 합니다.
sample_mflix 데이터베이스 의 movies 컬렉션 에 있는 문서에는 title 및 year와 같은 필드가 있습니다.
다음 예시 let 옵션을 사용하여 영화에 새 필드 찾고 추가하기 위한 변수를 정의합니다.
db.runCommand( { update: "movies", updates: [ { q: { $expr: { $eq: [ "$title", "$$movieTitle" ] } }, u: [ { $set: { franchise: "$$franchiseName" } } ] } ], let : { movieTitle: "The Godfather", franchiseName: "The Godfather Trilogy" } } )
다음 예시 c 에서 movieTitle 및 franchiseName 변수를 정의하고 변수를 사용하여 franchise 필드 추가합니다.
db.runCommand( { update: "movies", updates: [ { q: { $expr: { $eq: [ "$title", "$$movieTitle" ] } }, u: [ { $set: { franchise: "$$franchiseName" } } ], c: { movieTitle: "The Godfather", franchiseName: "The Godfather Trilogy" } } ] } )
출력
반환된 문서에는 다음 필드의 하위 집합이 포함되어 있습니다.
update.nupdate명령은 문서 업데이트 배열을 허용하며, 그 중 일부는 업서트일 수 있습니다. 업데이트의 경우n업데이트를 위해 선택된 문서 수입니다. 업서트의 경우, 삽입된 문서에 대해n은1입니다. 서버는 모든 업데이트 및 업서트에 대한n값을 추가하고 합계를update.n으로 반환합니다.업데이트 작업으로 인해 문서가 변경되지 않는 경우는 예를 들면 다음과 같습니다.
$set표현식은 값을 현재 값으로 업데이트합니다.n은nModified보다 클 수 있습니다.
update.nModified업데이트된 문서 수입니다. 필드 값을 현재 값으로 설정하는 등 업데이트 작업으로 인해 문서가 변경되지 않는 경우
nModified가n보다 작을 수 있습니다.참고
일부 문서가 스키마 유효성 검사에 실패하는 경우와 같이 일치하는 문서의 하위 집합이 업데이트되는 경우
update명령에서 반환되는nModified값이 정확하지 않을 수 있습니다.
update.writeErrors업데이트 작업 중에 발생한 오류에 관한 정보가 포함된 문서 배열입니다.
writeErrors배열에는 오류가 발생한 각 업데이트 문에 대한 오류 문서가 포함되어 있습니다.각 오류 문서에는 다음과 같은 필드가 포함되어 있습니다.
update.writeConcernError업데이트 작업 중에 발생한 오류에 관한 정보가 포함된 문서 배열입니다.
버전 에서 7.0.6 변경됨: (및 에서도 사용 6.0.14 5.0.30 가능):
update가 에서 실행되면 하나 이상의 쓰기 (write) 오류가 발생하더라도 쓰기 고려 (write concern) 오류가 항상mongos보고됩니다. 이전 릴리스에서는 쓰기 (write) 오류가 발생하면 이(가 ) 쓰기update고려 (write concern) 오류를 보고하지 않을 수 있었습니다.각 오류 문서에는 다음과 같은 필드가 포함되어 있습니다.
update.writeConcernError.errInfo.writeConcern해당 작업에 사용되는 쓰기 관련 객체입니다. 쓰기 문제 객체 필드에 대한 자세한 내용은 쓰기 문제 사양을 참조하세요.
쓰기 고려 객체에는 쓰기 문제의 원본을 나타내는 다음 필드도 포함될 수 있습니다.
update.writeConcernError.errInfo.writeConcern.provenance쓰기 문제가 발생한 위치를 나타내는 문자열 값입니다(쓰기 문제
provenance라고도 함). 다음 표에는 이 필드에 사용할 수 있는 값과 그 의미가 나와 있습니다.출처설명clientSupplied쓰기 우려 사항은 애플리케이션에서 지정되었습니다.
customDefault쓰기 고려는 사용자 정의된 기본값에서 비롯된 것입니다.
setDefaultRWConcern을 참조하십시오.getLastErrorDefaults쓰기 고려는 복제본 세트의
settings.getLastErrorDefaults필드에서 발생했습니다.implicitDefault쓰기 고려는 다른 모든 쓰기 고려 사양이 없는 상태에서 서버에서 발생했습니다.
버전 8.1.2에서 변경되었습니다.
update 이 샤딩된 클러스터의 mongos 에서 실행되면 하나 이상의 다른 오류가 발생하더라도 항상 응답에서 writeConcernError 이 보고됩니다. 이전 릴리스에서는 다른 오류로 인해 update 가 쓰기 고려 (write concern) 오류를 보고하지 않는 경우가 있었습니다.
예시 들어, 문서 유효성 검사 실패하여 DocumentValidationFailed 오류를 트리거하고 쓰기 고려 (write concern) 오류도 발생하면 응답의 최상위 필드 에 DocumentValidationFailed 오류와 writeConcernError 가 모두 반환됩니다.
앞서 언급한 업데이트 관련 반환 필드 외에도 db.runCommand()에는 추가 정보가 포함되어 있습니다:
복제본 세트의 경우:
optime,electionId,$clusterTime및operationTime.샤딩된 클러스터의 경우:
operationTime및$clusterTime.
이러한 필드에 대한 자세한 내용은 db.runCommand 응답을 참조하세요.
다음은 업서트를 수행한 update 명령이 성공했을 때 반환되는 문서의 예시입니다.
{ "ok" : 1, "nModified" : 0, "n" : 1, "upserted" : [ { "index" : 0, "_id" : ObjectId("52ccb2118908ccd753d65882") } ] }
다음은 업데이트 성명서가 3개 포함된 대량 업데이트에 대해 반환된 문서 예시입니다. 한 개의 업데이트 성명서는 성공하고 다른 두 개의 업데이트 성명서에서는 오류가 발생했습니다.
{ "ok" : 1, "nModified" : 1, "n" : 1, "writeErrors" : [ { "index" : 1, "code" : 16837, "errmsg" : "The _id field cannot be changed from {_id: 1.0} to {_id: 5.0}." }, { "index" : 2, "code" : 16837, "errmsg" : "The _id field cannot be changed from {_id: 2.0} to {_id: 6.0}." }, ] }