문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

db.collection.findOneAndDelete()

이 페이지의 내용

  • 정의
  • 행동
  • 예제
db.collection.findOneAndDelete( filter, options )

버전 3.2에 새로 추가되었습니다.

중요

Mongo쉬 방법

이 페이지에서는 mongosh 메서드를 설명합니다. 이는 데이터베이스 명령이나 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다 .

데이터베이스 명령에 대해서는 delete 명령을 참조하십시오.

MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.

레거시 mongo 셸 문서는 해당 MongoDB 서버 릴리스 문서를 참조하세요.

Mongo 셸 V4.4

filtersort 기준에 따라 단일 문서를 삭제하고 삭제된 문서를 반환합니다.

findOneAndDelete() 메서드의 형식은 다음과 같습니다.

db.collection.findOneAndDelete(
<filter>,
{
writeConcern: <document>,
projection: <document>,
sort: <document>,
maxTimeMS: <number>,
collation: <document>
}
)

findOneAndDelete() 메서드는 다음 매개 변수를 사용합니다.

매개변수
유형
설명
filter
문서

삭제를 위한 선택 기준입니다. find() 메서드에서와 동일한 쿼리 선택기를 사용할 수 있습니다.

컬렉션에서 반환된 첫 번째 문서를 삭제하려면 빈 문서 { }를 지정합니다.

지정하지 않으면 빈 문서로 기본 설정됩니다.

쿼리 인수가 문서가 아닌 경우 작업 오류가 발생합니다.

writeConcern
문서

선택 사항입니다. 쓰기 고려를 표현하는 문서입니다. 기본 쓰기 고려를 사용하지 않으려면 생략하세요.

{ w: <value>, j: <boolean>, wtimeout: <number> }

사용법은 WriteConcern을 사용하여 문서 삭제를 참조하세요.

트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요.

projection
문서

선택 사항. 반환할 필드의 하위 집합입니다.

일치하는 문서의 모든 필드를 반환하려면 이 매개 변수를 생략하세요.

프로젝션 인수가 문서가 아닌 경우 연산 오류가 발생합니다.

sort
문서

선택 사항. filter와 일치하는 문서의 정렬 순서를 지정합니다.

정렬 인수가 문서가 아닌 경우 작업 오류가 발생합니다.

cursor.sort()참조하십시오.

maxTimeMS
숫자
선택 사항. 작업을 완료해야 하는 시간 제한을 밀리초 단위로 지정합니다. 제한을 초과하면 오류를 반환합니다.
collation
문서

선택 사항.

작업에 사용할 데이터 정렬을 지정합니다.

데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.

데이터 정렬 옵션의 구문은 다음과 같습니다:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

데이터 정렬을 지정할 때 locale 필드는 필수이고, 다른 데이터 정렬 필드는 모두 선택 사항입니다. 필드에 대한 설명은 데이터 정렬 문서를 참조하세요.

데이터 정렬이 지정되지 않았지만 컬렉션에 기본 데이터 정렬이 있는 경우( db.createCollection() 참조), 작업은 컬렉션에 지정된 데이터 정렬을 사용합니다.

컬렉션 또는 연산에 대한 데이터 정렬이 지정되지 않은 경우, MongoDB는 이전 버전에서 문자열 비교에 사용된 간단한 이진 비교를 사용합니다.

한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다.

버전 3.4에 새로 추가되었습니다.

반환합니다:삭제된 문서를 반환합니다.

findOneAndDelete() filter 와 일치하는 컬렉션의 첫 번째 일치 문서를 삭제합니다. sort 매개변수를 사용하여 삭제되는 문서에 영향을 줄 수 있습니다.

중요

언어 일관성

find()findAndModify() 프로젝션을 애그리게이션의 $project 단계와 일치시키기 위한 일환으로,

projection 매개변수는 다음 형식의 문서를 사용합니다.

{ field1: <value>, field2: <value> ... }
프로젝션
설명
<field>: <1 or true>
필드 포함 여부를 지정합니다. 프로젝션 값에 0이 아닌 정수를 지정하면 연산은 해당 값을 true로 취급합니다.
<field>: <0 or false>
필드 제외 여부를 지정합니다.
"<field>.$": <1 or true>

$ 배열 프로젝션 연산자를 사용하여 배열 필드의 쿼리 조건과 일치하는 첫 번째 요소를 반환합니다. 프로젝션 값에 대해 0이 아닌 정수를 지정하면 연산은 값을 true로 처리합니다.

에는 사용할 수 없습니다.

<field>: <array projection>

배열 프로젝션 연산자($elemMatch, $slice)를 사용하여 포함할 배열 요소를 지정합니다.

에는 사용할 수 없습니다.

<field>: <aggregation expression>

프로젝션된 필드의 값을 지정합니다.

리터럴 및 애그리게이션 변수 사용을 포함하여 애그리게이션 표현식과 구문 을 사용하여 새 필드를 프로젝트하거나 기존 필드를 새 값으로 프로젝트할 수 있습니다.

  • 프로젝션 값에 숫자가 아니면서 부울이 아닌 리터럴(예: 리터럴 문자열, 배열 또는 연산자 표현식)을 지정하면 필드가 새 값으로 프로젝션됩니다.

    • { field: [ 1, 2, 3, "$someExistingField" ] }

    • { field: "New String Value" }

    • { field: { status: "Active", total: { $sum: "$existingArray" } } }

  • 필드의 리터럴 값을 프로젝션하려면 다음 예시와 같은 $literal 애그리게이션 표현식을 사용하세요.

    • { field: { $literal: 5 } }

    • { field: { $literal: true } }

    • { field: { $literal: { fieldWithValue0: 0, fieldWithValue1: 1 } } }

포함된 문서의 필드에 대해서는 다음 둘 중 하나를 사용하여 필드를 지정할 수 있습니다.

  • 점 표기법(예: "field.nestedfield": <value>

  • 중첩된 양식(예: { field: { nestedfield: <value> } }

필드를 표시하지 않기 위해 프로젝션에서 _id: 0을 명시적으로 지정하지 않는 한 _id 필드는 기본적으로 반환된 문서에 포함됩니다.

projection 필드는 포함과 제외 사양을 모두 포함할 수 없습니다. 단, _id 필드는 예외입니다.

  • 필드를 명시적으로 포함하는 프로젝션에서 _id 필드는 명시적으로 제외할 수 있는 유일한 필드입니다.

  • 필드를 명시적으로 제외하는 프로젝션에서는 _id 필드가 명시적으로 포함할 수 있는 유일한 필드이지만, _id 필드는 기본적으로 포함됩니다.

프로젝션에 대한 자세한 내용은 다음 섹션도 같이 참조하세요.

샤드된 컬렉션에 대해 db.collection.findOneAndDelete() 를 사용하는 경우 query 에는 샤드 키에 대한 동등 조건이 포함 되어야 합니다.

샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락될 수 있습니다. 샤드 키가 누락된 문서를 대상으로 하려면 null 동등성 매치를 다른 필터 조건(예: _id 필드)과 함께 사용할 수 있습니다. 예를 들면 다음과 같습니다.

{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key

db.collection.findOneAndDelete()분산 트랜잭션 내에서 사용할 수 있습니다.

트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요.

중요

대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.

추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 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 }

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 쓰기 고려에 대한 시간 제한(밀리초)을 지정할 수 있습니다. wtimeoutw 가 ~보다 큰 경우에만 적용됩니다.

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 }

다음 작업은 프로젝션을 사용하여 반환된 문서의 _idassignment 필드만 반환합니다.

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" }

참고

이 오류 메시지는 간결성을 위해 줄였습니다.

버전 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.findOneAndDelete(
{ category: "cafe", status: "a" },
{ collation: { locale: "fr", strength: 1 } }
);

연산은 다음 문서를 반환합니다.

{ "_id" : 1, "category" : "café", "status" : "A" }
← db.collection.findOne()

이 페이지의 내용