db.collection.findOneAndReplace()
드라이버가 포함된 MongoDB
이 페이지에서는 mongosh
메서드를 설명합니다. MongoDB 드라이버에서 해당 메서드를 보려면 프로그래밍 언어의 해당 페이지를 참조하세요.
정의
db.collection.findOneAndReplace( filter, replacement, options )
지정된 필터를기반으로 단일 문서를 대체합니다.
구문
findOneAndReplace()
메서드의 형식은 다음과 같습니다.
db.collection.findOneAndReplace( <filter>, <replacement>, { writeConcern: <document>, projection: <document>, sort: <document>, maxTimeMS: <number>, upsert: <boolean>, returnDocument: <string>, returnNewDocument: <boolean>, collation: <document> } )
필드 및 옵션
findOneAndReplace()
메서드에는 다음 필드와 옵션이 사용됩니다.
필드 | 유형 | 설명 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
문서 | ||||||||||||
문서 | ||||||||||||
writeConcern | 문서 | 선택 사항입니다. 쓰기 고려를 표현하는 문서입니다. 기본 쓰기 고려를 사용하지 않으려면 생략하세요.
트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요. | ||||||||||
문서 | 선택 사항. 반환할 필드의 하위 집합입니다. 일치하는 문서의 모든 필드를 반환하려면 이 매개 변수를 생략하세요. 프로젝션 인수가 문서가 아닌 경우 작업 오류가 발생합니다. | |||||||||||
문서 | ||||||||||||
maxTimeMS | 숫자 | 선택 사항. 작업을 완료해야 하는 시간 제한을 밀리초 단위로 지정합니다. 제한을 초과하면 오류를 반환합니다. | ||||||||||
부울 | 선택 사항입니다.
업서트가 여러 번 발생하지 않도록 하려면 기본값은 | |||||||||||
문자열 | 선택 사항.
| |||||||||||
부울 | 선택 사항. 기본값은 | |||||||||||
문서 | 선택 사항. 작업에 사용할 데이터 정렬을 지정합니다. 데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다. 데이터 정렬 옵션의 구문은 다음과 같습니다:
데이터 정렬을 지정할 때 데이터 정렬이 지정되지 않았지만 컬렉션에 기본 데이터 정렬이 있는 경우( 컬렉션 또는 연산에 대한 데이터 정렬이 지정되지 않은 경우, MongoDB는 이전 버전에서 문자열 비교에 사용된 간단한 이진 비교를 사용합니다. 한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다. |
반환
기본적으로 원본 문서를 반환합니다. returnDocument가 after
로 설정되어 있거나 returnNewDocument가 true
로 설정된 경우 업데이트된 문서를 반환합니다.
행동
문서 일치
db.collection.findOneAndReplace()
(은)는 filter
(과)와 일치하는 컬렉션의 첫 번째 일치 문서를 대체합니다. sort
필드를 사용하여 수정되는 문서에 영향을 줄 수 있습니다.
프로젝션
중요
언어 일관성
find()
및 findAndModify()
프로젝션을 집계의 $project
단계와 일치시키는 작업의 일환으로,
find()
및 프로젝션은 집계 표현식findAndModify()
및 구문을 사용할 수 있습니다.MongoDB는 프로젝션과 관련하여 추가 제한 사항을 시행합니다. 자세한 내용은 프로젝션 제한 사항을 참조하세요.
projection
필드에는 다음 형식의 문서가 사용됩니다:
{ field1: <value>, field2: <value> ... }
프로젝션 | 설명 |
---|---|
<field>: <1 or true> | 필드 포함 여부를 지정합니다. 프로젝션 값에 0이 아닌 정수를 지정하면 연산은 해당 값을 true 로 취급합니다. |
<field>: <0 or false> | 필드 제외 여부를 지정합니다. |
"<field>.$": <1 or true> | |
<field>: <array projection> | 배열 프로젝션 연산자( 뷰에는 사용할 수 없습니다. |
<field>: <aggregation expression> | 프로젝션된 필드의 값을 지정합니다. 리터럴 및 집계 변수 사용을 포함한 집계 식 및 구문을 사용하면 새 필드를 프로젝션하거나 기존 필드를 새 값으로 프로젝션할 수 있습니다.
|
임베디드 필드 지정
내장된 문서의 필드에 대해서는 다음 둘 중 하나를 사용하여 필드를 지정할 수 있습니다.
점 표기법(예시:
"field.nestedfield": <value>
중첩된 양식, 예를 들어
{ field: { nestedfield: <value> } }
_id
필드 프로젝션
필드를 표시하지 않기 위해 프로젝션에서 _id: 0
을 명시적으로 지정하지 않는 한 _id
필드는 기본적으로 반환된 문서에 포함됩니다.
포함 또는 제외
projection
필드는 포함과 제외 사양을 모두 포함할 수 없습니다. 단, _id
필드는 예외입니다.
필드를 명시적으로 포함하는 프로젝션에서
_id
필드는 명시적으로 제외할 수 있는 유일한 필드입니다.필드를 명시적으로 제외하는 프로젝션에서는
_id
필드가 명시적으로 포함할 수 있는 유일한 필드이지만,_id
필드는 기본적으로 포함됩니다.
프로젝션에 대한 자세한 내용은 다음 섹션도 같이 참조하세요.
샤드 컬렉션
샤딩된 컬렉션에서 db.collection.findOneAndReplace()
를 사용하려면 쿼리 필터 에 샤드 키에 대한 동등 조건이반드시 포함되어야 합니다.
샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락 될 수 있습니다. 샤드 키가 없는 문서를 대상으로 지정하려면 null
동등성 매치를 다른 필터 조건(예시: _id
필드)과 함께 사용할 수 있습니다. 예를 들어 다음과 같습니다.
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
샤드 키 수정
샤드 키 필드가 변경할 수 없는 _id
필드가 아닌 경우 문서의 샤드 키 값을 업데이트할 수 있습니다.
경고
샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락될 수 있습니다. 문서의 샤드 키 값을 변경할 때 실수로 샤드 키를 제거하지 않도록 주의해야 합니다.
기존 샤드 키 값을 db.collection.findOneAndReplace()
으로 수정하려면 다음을 수행합니다.
누락된 샤드 키
샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락 될 수 있습니다. db.collection.findOneAndReplace()
를 사용하여 문서의 누락된 샤드 키를 설정하려면 다음을 수행해야 합니다.
반드시
mongos
에서 실행해야 합니다. 샤드에서 직접 작업을 실행하지 않아야 합니다.전체 샤드 키에 동등성 필터를 포함시켜야 합니다.
팁
누락된 키 값은 null 동등성 매치의 일부로 반환되므로 null 값 키가 업데이트되지 않도록 하려면 추가 쿼리 조건(예: _id
필드)을 적절히 포함하세요.
다음도 참조하세요.
트랜잭션
db.collection.findOneAndReplace()
는 분산 트랜잭션 내에서 사용할 수 있습니다.
중요
대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.
추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.
트랜잭션 내 업서트
트랜잭션이 교차 샤드 쓰기 트랜잭션(write transaction)이 아닌 경우 분산 트랜잭션 내에서 컬렉션과 인덱스를 생성할 수 있습니다.
upsert: true
인 db.collection.findOneAndReplace()
는 기존 컬렉션이나 존재하지 않는 컬렉션에서 실행될 수 있습니다. 존재하지 않는 컬렉션에서 실행하면 작업이 컬렉션을 만듭니다.
쓰기 고려 및 트랜잭션
트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요.
oplog 항목
db.collection.findOneAndReplace()
작업이 문서를 성공적으로 바꾸면 이 작업은 oplog(작업 로그)에 항목을 추가합니다. 작업이 실패하거나 바꿀 문서를 찾지 못하면 작업은 oplog에 항목을 추가하지 않습니다.
예시
문서 대체
다음 문서로 샘플 scores
컬렉션을 생성합니다.
db.scores.insertMany([ { "_id" : 1, "team" : "Fearful Mallards", "score" : 25000 }, { "_id" : 2, "team" : "Tactful Mooses", "score" : 23500 }, { "_id" : 3, "team" : "Aquatic Ponies", "score" : 19250 }, { "_id" : 4, "team" : "Cuddly Zebras", "score" : 15235 }, { "_id" : 5, "team" : "Garrulous Bears", "score" : 18000 } ]);
다음 작업은 score
이 20000
보다 작은 문서를 찾아서 대체하는 작업입니다.
db.scores.findOneAndReplace( { "score" : { $lt : 20000 } }, { "team" : "Observant Badgers", "score" : 20000 } )
이 작업은 대체된 원본 문서를 반환합니다.
{ "_id" : 3, "team" : "Aquatic Ponies", "score" : 19250 }
returnNewDocument가 true인 경우 연산은 대체 문서를 대신 반환합니다.
여러 문서가 필터 기준을 충족하지만, db.collection.findOneAndReplace()
는 하나의 문서만 대체합니다.
문서 정렬 및 바꾸기
다음 문서로 샘플 scores
컬렉션을 생성합니다.
db.scores.insertMany([ { "_id" : 1, "team" : "Fearful Mallards", "score" : 25000 }, { "_id" : 2, "team" : "Tactful Mooses", "score" : 23500 }, { "_id" : 3, "team" : "Aquatic Ponies", "score" : 19250 }, { "_id" : 4, "team" : "Cuddly Zebras", "score" : 15235 }, { "_id" : 5, "team" : "Garrulous Bears", "score" : 18000 } ]);
다음 예시에서는 score
필드에 오름차순 정렬을 포함하여 필터와 일치하는 문서 중 점수가 가장 낮은 문서를 바꿉니다.
db.scores.findOneAndReplace( { "score" : { $lt : 20000 } }, { "team" : "Observant Badgers", "score" : 20000 }, { sort: { "score" : 1 } } )
이 작업은 대체된 원본 문서를 반환합니다.
{ "_id" : 4, "team" : "Cuddly Zebras", "score" : 15235 }
이 명령의 정렬되지 않은 결과는 문서 바꾸기를 참조하세요.
반환 문서의 프로젝트 특정 필드
다음 문서로 샘플 scores
컬렉션을 생성합니다.
db.scores.insertMany([ { "_id" : 1, "team" : "Fearful Mallards", "score" : 25000 }, { "_id" : 2, "team" : "Tactful Mooses", "score" : 23500 }, { "_id" : 3, "team" : "Aquatic Ponies", "score" : 19250 }, { "_id" : 4, "team" : "Cuddly Zebras", "score" : 15235 }, { "_id" : 5, "team" : "Garrulous Bears", "score" : 18000 } ])
다음 작업에서는 프로젝션을 사용하여 반환된 문서에 team
필드만 표시합니다.
db.scores.findOneAndReplace( { "score" : { $lt : 22250 } }, { "team" : "Therapeutic Hamsters", "score" : 22250 }, { sort : { "score" : 1 }, projection: { "_id" : 0, "team" : 1 } } )
이 작업은 team
필드만 있는 원본 문서를 반환합니다.
{ "team" : "Cuddly Zebras" }
시간 제한으로 문서 바꾸기
다음 작업은 완료까지 5ms의 시간 제한을 설정합니다.
try { db.scores.findOneAndReplace( { "score" : { $gt : 25000 } }, { "team" : "Emphatic Rhinos", "score" : 25010 }, { maxTimeMS: 5 } ); } catch(e){ print(e); }
작업이 시간 제한을 초과하면 작업은 다음을 반환합니다.
Error: findAndModifyFailed failed: { "ok" : 0, "errmsg" : "operation exceeded time limit", "code" : 50 }
문서를 업서트로 바꾸기
다음 작업에서는 필터와 일치하는 문서가 없는 경우 업서트 필드를 사용하여 대체 문서를 삽입합니다.
try { db.scores.findOneAndReplace( { "team" : "Fortified Lobsters" }, { "_id" : 6019, "team" : "Fortified Lobsters" , "score" : 32000}, { upsert : true, returnDocument: "after" } ); } catch (e){ print(e); }
이 연산은 다음을 반환합니다:
{ "_id" : 6019, "team" : "Fortified Lobsters", "score" : 32000 }
returnDocument: "before"
를 설정한 경우 반환할 원본 문서가 없기 때문에 이 작업은 null
을 반환합니다.
데이터 정렬 지정
데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.
다음 문서로 샘플 myColl
컬렉션을 생성합니다.
db.myColl.insertMany([ { _id: 1, category: "café", status: "A" }, { _id: 2, category: "cafe", status: "a" }, { _id: 3, category: "cafE", status: "a" } ]);
다음 작업에는 데이터 정렬 옵션이 포함되어 있습니다.
db.myColl.findOneAndReplace( { category: "cafe", status: "a" }, { category: "cafÉ", status: "Replaced" }, { collation: { locale: "fr", strength: 1 } } );
연산은 다음 문서를 반환합니다.
{ "_id" : 1, "category" : "café", "status" : "A" }