드라이버가 포함된 MongoDB
이 페이지에서는 mongosh 메서드를 설명합니다. MongoDB 드라이버에서 해당 메서드를 보려면 프로그래밍 언어의 해당 페이지를 참조하세요.
정의
구문
findOneAndDelete() 메서드의 형식은 다음과 같습니다.
db.collection.findOneAndDelete( <filter>, { writeConcern: <document>, projection: <document>, sort: <document>, maxTimeMS: <number>, collation: <document> } )
매개변수
findOneAndDelete() 메서드는 다음 매개변수를 사용합니다.
Parameter | 유형 | 설명 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 문서 | |||||||||||
| 문서 | 선택 사항입니다. 쓰기 고려를 표현하는 문서입니다. 기본 쓰기 고려를 사용하지 않으려면 생략하세요. 사용법은 WriteConcern을 사용하여 문서 삭제를 참조하세요. 트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요. | ||||||||||
| 문서 | 선택 사항. 반환할 필드의 하위 집합입니다. 일치하는 문서의 모든 필드를 반환하려면 이 매개 변수를 생략하세요. 프로젝션 인수가 문서가 아닌 경우 작업 오류가 발생합니다. | ||||||||||
| 문서 | |||||||||||
| 숫자 | 선택 사항. 작업을 완료해야 하는 시간 제한을 밀리초 단위로 지정합니다. 제한을 초과하면 오류를 반환합니다. | ||||||||||
| 문서 | 선택 사항. 작업에 사용할 데이터 정렬을 지정합니다. 데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다. 데이터 정렬 옵션의 구문은 다음과 같습니다: 데이터 정렬을 지정할 때 데이터 정렬이 지정되지 않았지만 컬렉션에 기본 데이터 정렬이 있는 경우( 컬렉션 또는 연산에 대한 데이터 정렬이 지정되지 않은 경우, MongoDB는 이전 버전에서 문자열 비교에 사용된 간단한 이진 비교를 사용합니다. 한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다. |
호환성
이 메서드는 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
참고
이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 관해 자세히 알아보려면 지원되지 않는 명령을 참조하십시오.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
행동
문서 일치
findOneAndDelete()는 filter와 일치하는 컬렉션에서 첫 번째 일치 문서를 삭제합니다. sort 매개 변수를 사용하여 어떤 문서가 삭제되는지에 영향을 줄 수 있습니다.
프로젝션
중요
언어 일관성
find() 및 findAndModify() 프로젝션을 집계의 $project 단계와 일치시키는 작업의 일환으로,
find()및 프로젝션은 집계 표현식findAndModify()및 구문을 사용할 수 있습니다.MongoDB는 프로젝션과 관련하여 추가 제한 사항을 시행합니다. 자세한 내용은 프로젝션 제한 사항을 참조하세요.
projection 매개변수는 다음 형식의 문서를 사용합니다.
{ field1: <value>, field2: <value> ... }
프로젝션 | 설명 |
|---|---|
| 필드 포함 여부를 지정합니다. 프로젝션 값에 0이 아닌 정수를 지정하면 연산은 해당 값을 |
| 필드 제외 여부를 지정합니다. |
| |
| 배열 프로젝션 연산자( 뷰에는 사용할 수 없습니다. |
| 프로젝션된 필드의 값을 지정합니다. 리터럴 및 집계 변수 사용을 포함한 집계 식 및 구문을 사용하면 새 필드를 프로젝션하거나 기존 필드를 새 값으로 프로젝션할 수 있습니다.
|
임베디드 필드 지정
내장된 문서의 필드에 대해서는 다음 둘 중 하나를 사용하여 필드를 지정할 수 있습니다.
점 표기법(예시:
"field.nestedfield": <value>중첩된 양식, 예를 들어
{ field: { nestedfield: <value> } }
_id 필드 프로젝션
필드를 표시하지 않기 위해 프로젝션에서 _id: 0을 명시적으로 지정하지 않는 한 _id 필드는 기본적으로 반환된 문서에 포함됩니다.
포함 또는 제외
projection 필드는 포함과 제외 사양을 모두 포함할 수 없습니다. 단, _id 필드는 예외입니다.
필드를 명시적으로 포함하는 프로젝션에서
_id필드는 명시적으로 제외할 수 있는 유일한 필드입니다.필드를 명시적으로 제외하는 프로젝션에서는
_id필드가 명시적으로 포함할 수 있는 유일한 필드이지만,_id필드는 기본적으로 포함됩니다.
프로젝션에 대한 자세한 내용은 다음 섹션도 같이 참조하세요.
샤드 컬렉션
샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락될 수 있습니다. 샤드 키가 누락된 문서를 대상으로 하려면 null 동등성 매치를 다른 필터 조건(예: _id 필드)과 함께 사용할 수 있습니다. 예를 들면 다음과 같습니다.
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
트랜잭션
db.collection.findOneAndDelete()는 분산 트랜잭션 내에서 사용할 수 있습니다.
트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요.
중요
대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.
추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.
oplog 항목
db.collection.findOneAndDelete() 작업이 문서를 성공적으로 삭제하면 이 작업은 oplog에 항목을 추가합니다. 이 작업이 실패하거나 삭제할 문서를 찾지 못하면 oplog에 항목을 추가하지 않습니다.
예시
문서 삭제
scores 컬렉션에는 다음과 유사한 문서가 포함되어 있습니다.
db.scores.insertMany( [ { _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 }, { _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 }, { _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 }, { _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 }, { _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 }, { _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 } ] )
다음 작업에서는 name : M. Tagnum이 있는 첫 번째 문서를 찾아 삭제합니다.
db.scores.findOneAndDelete( { "name" : "M. Tagnum" } )
이 작업은 삭제된 원본 문서를 반환합니다.
{ _id: 6312, name: "M. Tagnum", "assignment" : 5, "points" : 30 }
WriteConcern을 사용하여 문서 삭제하기
scores 컬렉션에는 다음과 유사한 문서가 포함되어 있습니다.
db.scores.insertMany( [ { _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 }, { _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 }, { _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 }, { _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 }, { _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 }, { _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 } ] )
다음 작업은 db.collection.findOneAndDelete() 메서드 내부의 쓰기 고려 문서를 옵션과 함께 사용합니다.
w:1쓰기 작업이 독립형 mongod 또는 복제본 세트의 프라이머리로 전파되었음을 확인 요청합니다.j:true는 삭제가 온디스크 저널에 기록되도록w:1에 지정된 MongoDB 인스턴스의 수를 알려줍니다.wtimeout : 1000쓰기 고려에 대한 시간 제한(밀리초)을 지정할 수 있습니다.wtimeout은w가 ~보다 큰 경우에만 적용됩니다.
db.scores.findOneAndDelete( { name: "A. MacDyver" }, { writeConcern: { w : 1, j : true, wtimeout : 1000 } } )
연산은 다음 문서를 반환합니다.
{ _id: 6305, name: 'A. MacDyver', assignment: 5, points: 24 }
writeConcern 옵션을 지정하면 문서가 삭제됩니다.
문서 정렬 및 삭제
scores 컬렉션에는 다음과 유사한 문서가 포함되어 있습니다.
db.scores.insertMany( [ { _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 }, { _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 }, { _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 }, { _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 }, { _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 }, { _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 } ] )
다음 작업은 먼저 name : "A. MacDyver"가 있는 모든 문서를 찾습니다. 그런 다음 가장 낮은 포인트 값을 가진 문서를 삭제하기 전에 points를 기준으로 오름차순으로 정렬합니다.
db.scores.findOneAndDelete( { "name" : "A. MacDyver" }, { sort : { "points" : 1 } } )
이 작업은 삭제된 원본 문서를 반환합니다.
{ _id: 6322, name: "A. MacDyver", "assignment" : 2, "points" : 14 }
삭제된 문서 투사하기
다음 작업은 프로젝션을 사용하여 반환된 문서의 _id 및 assignment 필드만 반환합니다.
db.scores.findOneAndDelete( { "name" : "A. MacDyver" }, { sort : { "points" : 1 }, projection: { "assignment" : 1 } } )
이 연산은 assignment 및 _id 필드가 있는 원본 문서를 반환합니다.
{ _id: 6322, "assignment" : 2 }
시간 제한이 있는 문서 업데이트
다음 작업은 삭제를 완료하는 데 5ms의 시간 제한을 설정합니다.
try { db.scores.findOneAndDelete( { "name" : "A. MacDyver" }, { sort : { "points" : 1 }, maxTimeMS : 5 } ) } catch(e){ print(e) }
작업이 시간 제한을 초과하면 작업은 다음을 반환합니다.
MongoServerError: operation exceeded time limit: { "ok": 0, "code" : 50, "codeName" : "MaxTimeMSExpired" }
참고
이 오류 메시지는 간결성을 위해 줄였습니다.
데이터 정렬 지정
데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.
컬렉션 myColl에는 다음 문서가 있습니다.
db.myColl.insertMany( [ { _id: 1, category: "café", status: "A" }, { _id: 2, category: "cafe", status: "a" }, { _id: 3, category: "cafE", status: "a" } ] )
다음 작업에는 데이터 정렬 옵션이 포함됩니다.
db.myColl.findOneAndDelete( { category: "cafe", status: "a" }, { collation: { locale: "fr", strength: 1 } } );
연산은 다음 문서를 반환합니다.
{ "_id" : 1, "category" : "café", "status" : "A" }