db.collection.findOneAndReplace()
정의
db.collection.findOneAndReplace( filter, replacement, options )
중요
Mongo쉬 방법
이 페이지에서는
mongosh
메서드를 설명합니다. 이는 데이터베이스 명령 또는 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다.데이터베이스 명령의 경우
update
명령을 참조하세요.MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.
버전 3.2에 새로 추가되었습니다.
지정된 필터를기반으로 단일 문서를 대체합니다.
구문
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는 이전 버전에서 문자열 비교에 사용된 간단한 이진 비교를 사용합니다. 한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다. 버전 3.4에 새로 추가되었습니다. |
반환
기본적으로 원본 문서를 반환합니다. 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
을 반환합니다.
데이터 정렬 지정
버전 3.4에 새로 추가되었습니다.
데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.
다음 문서로 샘플 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" }