Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

삭제

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 명령 필드
  • 행동
  • 예시
  • 출력
delete

delete 명령은 컬렉션에서 문서를 제거합니다. 하나의 delete 명령에 여러 삭제 지정이 포함될 수 있습니다. MongoDB 드라이버에서 제공하는 삭제 메서드는 내부적으로 이 명령을 사용합니다.

버전 5.0에서 변경됨

mongosh 에서 이 명령은 deleteOne(), deleteMany()findOneAndDelete() 헬퍼 메서드를 통해서도 실행 수 있습니다.

헬퍼 메서드는 mongosh 사용자에게 편리하지만 데이터베이스 명령과 동일한 수준의 정보를 반환하지 못할 수 있습니다. 편의가 필요하지 않거나 추가 리턴 필드가 필요한 경우 데이터베이스 명령을 사용합니다.

반환합니다:작업 상태가 포함된 문서입니다. 자세한 내용은 출력을 참조하세요.

이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

참고

이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 관해 자세히 알아보려면 지원되지 않는 명령을 참조하십시오.

명령은 다음과 같은 구문을 가집니다:

db.runCommand(
{
delete: <collection>,
deletes: [
{
q : <query>,
limit : <integer>,
collation: <document>,
hint: <document|string>
},
...
],
comment: <any>,
let: <document>, // Added in MongoDB 5.0
ordered: <boolean>,
writeConcern: { <write concern> },
maxTimeMS: <integer>
}
)

이 명령은 다음 필드를 사용합니다.

필드
유형
설명

문자열

대상 컬렉션의 이름입니다.

배열

명명된 컬렉션에서 수행할 하나 이상의 삭제 문의 배열입니다.

comment

any

선택 사항. 이 명령에 첨부할 사용자 제공 코멘트입니다. 설정되면 이 설명은 다음 위치에서 이 명령의 레코드와 함께 표시됩니다.

댓글은 유효한 모든 BSON types (문자열, 정수, 객체, 배열 등)이 될 수 있습니다.

문서

선택 사항.

변수 목록이 있는 문서를 지정합니다. 이를 통해 쿼리 텍스트에서 변수를 분리하여 명령 가독성을 향상시킬 수 있습니다.

문서 구문은 다음과 같습니다:

{
<variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n>
}

변수는 표현식에서 반환된 값으로 설정되며 이후에는 변경할 수 없습니다.

명령에서 변수 값에 액세스하려면 $$<variable_name> 형식의 이중 달러 기호 접두사 ($$) 를 변수 이름과 함께 사용하십시오.예시: $$targetTotal.

변수를 사용하여 결과를 필터링하려면 $expr 연산자 내에서 변수에 액세스해야 합니다.

및 변수를 사용하는 전체 예시 let 는 에서 변수 사용을 참조하세요.let

버전 5.0에 추가.

부울

선택 사항. true 인 경우 삭제 문이 실패하면 나머지 삭제 문을 수행하지 않고 반환됩니다. false 인 경우 삭제 명령문이 실패하면 나머지 삭제 명령문 (있는 경우) 을 계속 사용하십시오. 기본값은 true입니다.

문서

선택 사항. 명령의 쓰기 고려 delete (write concern) 를 Express하는 문서입니다. 기본 쓰기 고려 (write concern)를 사용하려면 생략합니다.

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

maxTimeMS

non-negative integer

선택 사항.

시간 제한을 밀리초 단위로 지정합니다. maxTimeMS에 값을 지정하지 않으면 작업이 시간 초과되지 않습니다. 0 값은 바인딩되지 않는 기본 동작을 명시적으로 지정합니다.

MongoDB는 db.killOp()와 동일한 메커니즘을 사용하여 할당된 시간 제한을 초과하는 작업을 종료합니다. MongoDB는 지정된 중단 지점 중 하나에서만 작업을 종료합니다.

deletes 배열의 각 요소에는 다음 필드가 포함되어 있습니다.

필드
유형
설명

문서

삭제할 문서와 일치하는 쿼리입니다.

integer

삭제할 일치하는 문서의 수입니다. 일치하는 모든 문서를 삭제하려면 0을 지정하고, 단일 문서를 삭제하려면 1을 지정합니다.

문서

선택 사항.

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

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

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

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

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

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

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

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

문서 또는 문자열

선택 사항. 쿼리 조건자를 지원 하는 데 사용할 인덱스를 지정하는 문서 또는 문자열입니다.

이 옵션은 인덱스 사양 문서 또는 인덱스 이름 문자열을 사용할 수 있습니다.

존재하지 않는 인덱스를 지정하면 연산 오류가 발생합니다.

예시 hint 는 삭제 작업에 지정을 참조하세요.

limit: 1 옵션을 지정하는 분할된 컬렉션에 대해 delete 작업을 사용하는 방법:

  • 하나의 샤드만 대상으로 하는 경우 쿼리 사양에서 부분 샤드 키를 사용할 수 있습니다.

  • 쿼리 사양에서 샤드 키 또는 _id 필드를 제공할 수 있습니다.

deletes 배열에 있는 모든 쿼리(예: q 필드 값)의 총 크기는 최대 BSON 문서 크기보다 작거나 같아야 합니다.

deletes 배열의 총 삭제 문서 수는 최대 일괄 크기보다 작거나 같아야 합니다.

delete는 분산 트랜잭션 내에서 사용할 수 있습니다.

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

중요

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

추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.

다음 예에서는 1limit 을 지정하여 statusD 인 문서 하나를 orders 컬렉션에서 삭제합니다.

db.runCommand(
{
delete: "orders",
deletes: [ { q: { status: "D" }, limit: 1 } ]
}
)

반환된 문서는 명령이 1 문서를 삭제했음을 보여줍니다. 자세한 내용은 출력을 참조하세요.

{ "ok" : 1, "n" : 1 }

참고

limit: 1 옵션을 지정하는 분할된 컬렉션에 대해 delete 작업을 사용하는 방법:

  • 하나의 샤드만 대상으로 하는 경우 쿼리 사양에서 부분 샤드 키를 사용할 수 있습니다.

  • 쿼리 사양에서 샤드 키 또는 _id 필드를 제공할 수 있습니다.

다음 예에서는 0limit 을 지정하여 status D 와 동일한 모든 문서를 orders 컬렉션에서 삭제합니다.

db.runCommand(
{
delete: "orders",
deletes: [ { q: { status: "D" }, limit: 0 } ],
writeConcern: { w: "majority", wtimeout: 5000 }
}
)

반환된 문서는 명령이 13 문서를 찾아서 삭제했음을 보여줍니다. 자세한 내용은 출력을 참조하세요.

{ "ok" : 1, "n" : 13 }

참고

대규모 컬렉션에서 모든 문서를 삭제하는 경우 컬렉션을 삭제하고 다시 만드는 것이 더 빠를 수 있습니다. 컬렉션을 삭제하기 전에 컬렉션의 모든 인덱스를 확인합니다. 원본 컬렉션에 존재했던 모든 인덱스를 다시 만들어야 합니다. 원본 컬렉션이 샤딩된 경우 다시 만든 컬렉션도 샤딩해야 합니다.

컬렉션 삭제에 대한 자세한 내용은 db.collection.drop()을 참조하세요.

빈 쿼리 조건과 0limit 를 지정하여 orders 컬렉션의 모든 문서를 삭제합니다.

db.runCommand(
{
delete: "orders",
deletes: [ { q: { }, limit: 0 } ],
writeConcern: { w: "majority", wtimeout: 5000 }
}
)

반환된 문서는 명령이 총 35 문서를 찾아 삭제했음을 보여 줍니다. 자세한 내용은 출력을 참조하세요.

{ "ok" : 1, "n" : 35 }

다음 예시에서는 orders 컬렉션에 대해 여러 삭제 작업을 수행합니다.

db.runCommand(
{
delete: "orders",
deletes: [
{ q: { status: "D" }, limit: 0 },
{ q: { cust_num: 99999, item: "abc123", status: "A" }, limit: 1 }
],
ordered: false,
writeConcern: { w: 1 }
}
)

반환된 문서는 명령이 삭제 문 두 개에 문서를 총 21개 찾아 삭제했음을 보여줍니다. 자세한 내용은 출력을 참조하세요.

{ "ok" : 1, "n" : 21 }

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

컬렉션 myColl에는 다음 문서가 있습니다.

{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }

다음 작업에는 데이터 정렬 옵션이 포함됩니다.

db.runCommand({
delete: "myColl",
deletes: [
{ q: { category: "cafe", status: "a" }, limit: 0, collation: { locale: "fr", strength: 1 } }
]
})

mongosh에서 다음 문서를 사용하여 members 컬렉션을 생성하세요.

db.members.insertMany([
{ "_id" : 1, "member" : "abc123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null },
{ "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" },
{ "_id" : 3, "member" : "lmn123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null },
{ "_id" : 4, "member" : "pqr123", "status" : "D", "points" : 20, "misc1" : "Deactivated", "misc2" : null },
{ "_id" : 5, "member" : "ijk123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null },
{ "_id" : 6, "member" : "cde123", "status" : "A", "points" : 86, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }
])

컬렉션에 다음 인덱스를 만듭니다.

db.members.createIndex( { status: 1 } )
db.members.createIndex( { points: 1 } )

다음 업데이트 작업은 인덱스 { status: 1 }을(를) 사용하도록 명시적으로 암시합니다.

db.runCommand({
delete: "members",
deletes: [
{ q: { "points": { $lte: 20 }, "status": "P" }, limit: 0, hint: { status: 1 } }
]
})

참고

존재하지 않는 인덱스를 지정하면 연산 오류가 발생합니다.

사용된 인덱스를 보려면 작업에 대해 explain을 실행하세요.

db.runCommand(
{
explain: {
delete: "members",
deletes: [
{ q: { "points": { $lte: 20 }, "status": "P" }, limit: 0, hint: { status: 1 } }
]
},
verbosity: "queryPlanner"
}
)

버전 5.0에 추가.

명령의 다른 곳에서 액세스할 수 있는 변수를 정의하려면 let 옵션을 사용합니다.

참고

변수를 사용하여 결과를 필터링하려면 $expr 연산자 내에서 변수에 액세스해야 합니다.

컬렉션 cakeFlavors을 만듭니다:

db.cakeFlavors.insertMany( [
{ _id: 1, flavor: "chocolate" },
{ _id: 2, flavor: "strawberry" },
{ _id: 3, flavor: "cherry" }
] )

다음 예시에서는 lettargetFlavor 변수를 정의하고 이 변수를 사용하여 딸기 케이크 맛을 검색합니다.

db.runCommand( {
delete: db.cakeFlavors.getName(),
deletes: [ {
q: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
limit: 1
} ],
let : { targetFlavor: "strawberry" }
} )

반환된 문서에는 다음 필드의 하위 집합이 포함되어 있습니다.

delete.ok

명령의 상태입니다.

delete.n

삭제된 문서 수입니다.

delete.writeErrors

삭제 작업 중에 발생한 오류에 관한 정보가 포함된 문서 배열입니다. writeErrors 배열에는 오류가 발생한 각 delete 문에 대한 오류 문서가 들어 있습니다.

각 오류 문서에는 다음 정보가 포함되어 있습니다.

delete.writeErrors.index

0부터 시작하는 색인을 사용하는 deletes 배열에서 삭제 문을 식별하는 정수입니다.

delete.writeErrors.code

오류를 식별하는 정수 값입니다.

delete.writeErrors.errmsg

오류에 대한 설명입니다.

delete.writeConcernError

쓰기 문제와 관련된 오류를 설명하고 다음 필드를 포함하는 문서입니다.

delete.writeConcernError.code

쓰기 문제 오류의 원인을 식별하는 정수 값입니다.

delete.writeConcernError.errmsg

쓰기 관련 오류의 원인에 대한 설명입니다.

delete.writeConcernError.errInfo.writeConcern

해당 작업에 사용되는 쓰기 관련 객체입니다. 쓰기 문제 객체 필드에 대한 자세한 내용은 쓰기 문제 사양을 참조하세요.

쓰기 고려 객체에는 쓰기 문제의 원본을 나타내는 다음 필드도 포함될 수 있습니다.

delete.writeConcernError.errInfo.writeConcern.provenance

쓰기 문제가 발생한 위치를 나타내는 문자열 값입니다(쓰기 문제 provenance 라고도 함). 다음 표에는 이 필드에 사용할 수 있는 값과 그 의미가 나와 있습니다.

출처
설명

clientSupplied

쓰기 우려 사항은 애플리케이션에서 지정되었습니다.

customDefault

쓰기 고려는 사용자 정의된 기본값에서 비롯된 것입니다. setDefaultRWConcern을 참조하십시오.

getLastErrorDefaults

쓰기 고려는 복제본 세트의 settings.getLastErrorDefaults 필드에서 발생했습니다.

implicitDefault

쓰기 고려는 다른 모든 쓰기 고려 사양이 없는 상태에서 서버에서 발생했습니다.

다음은 delete 명령이 성공하면 반환되는 문서 예시입니다.

{ ok: 1, n: 1 }

다음은 hint 필드에 존재하지 않는 인덱스를 지정하여 오류가 발생한 delete 명령에 대해 반환된 문서의 예입니다.

{
n: 0,
writeErrors: [
{
index: 0,
code: 2,
errmsg: 'error processing query: ns=test.products: hat $eq "bowler"\n' +
'Sort: {}\n' +
'Proj: {}\n' +
' planner returned error :: caused by :: hint provided does not correspond to an existing index'
}
],
ok: 1
}

돌아가기

쿼리 및 쓰기