delete() 는 쿼리 결과를 기반으로 쿼리가 문서를 삭제할 수 있도록 하는 데이터 조작 언어 (DML) 단계입니다. 이 단계는 쿼리 끝에 연결할 수 있으며 이전 단계의 __name__ 필드가 참조하는 모든 문서를 삭제합니다.
예
예를 들어 다음 쿼리는 users 문서 중
address.users가 USA로 설정되고 __create_time__이 10일 미만인 모든 문서를 삭제합니다.
Node.js
const pipeline = db.pipeline() .collectionGroup("users") .where(field("address.country").equal("USA")) .where(field("__create_time__").timestampAdd("day", 10).lessThan(currentTimestamp())) .delete(); await pipeline.execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import CurrentTimestamp, Field snapshot = ( client.pipeline() .collection_group("users") .where(Field.of("address.country").equal("USA")) .where( Field.of("__create_time__") .timestamp_add("day", 10) .less_than(CurrentTimestamp()) ) .delete() .execute() )
Java
Pipeline.Snapshot deleteResults = firestore.pipeline() .collectionGroup("users") .where(field("address.country").equal("USA")) .where(field("__create_time__").add(constant(10)).lessThan(currentTimestamp())) .delete() .execute().get();
Go
snapshot := client.Pipeline(). CollectionGroup("users"). Where(firestore.FieldOf("address.country").Equal("USA")). Where(firestore.FieldOf("__create_time__").Add(firestore.ConstantOf(10)).LessThan(firestore.CurrentTimestamp())). Delete(). Execute(ctx)
행동
응답
delete() 단계는 항상 삭제된 문서 수를 설명하는 { documents_modified: 28L }과 같은 단일 문서를 내보냅니다.
전체 컬렉션 삭제
다음과 같이 입력 단계에 delete()를 추가하여 컬렉션에서 모든 문서를 삭제할 수 있습니다.
Node.js
const results = await db.pipeline()
.collection("/users")
.delete()
.execute();
최종 delete() 이전의 where(...) 단계에서 예상된 문서만 업데이트하도록 문서를 적절하게 제한해야 합니다. 최종 delete() 단계 없이 먼저 쿼리를 실행하여 의도한 문서만 삭제되는지 확인하는 것이 좋습니다.
최종 단계
delete() 단계는 파이프라인의 끝에 있어야 하며 추가 단계를 제공할 수 없습니다.
모두 삭제
기본적으로 delete() 단계는 이전 단계에서 참조하는 모든 문서를 삭제합니다. 작업 부하의 크기를 제한하거나 필터 조건이 정확히 하나의 문서와 일치한다는 것을 알고 있는 경우 최종 delete() 전에 limit(1)을 추가하여 총 작업을 제한할 수 있습니다.
교차 컬렉션 변형
최종 delete() 단계는 필요한 모든 인증이 제공된다고 가정하고 __name__이 참조하는 모든 문서에 변형을 적용합니다. 여기에는 동일한 요청의 일부로 여러 다른 컬렉션 또는 컬렉션 그룹에서 문서를 삭제하는 것이 포함됩니다.
__name__ 필요
delete() 단계에서는 이전 단계에서 삭제할 문서 참조가 포함된 __name__ 필드를 제공해야 합니다. 이렇게 하지 않으면 런타임 오류가 발생하고 트랜잭션 외부에서 실행하면 부분적으로 성공할 수 있습니다.
collection(...),
collection_group(...),
database(...), and
documents(...)와 같은 대부분의 입력 단계에는 기본적으로 __name__ 필드가 포함되므로 프로젝션 (select(...) 등)을 사용하거나 문서에서 변환 (aggregate(...) 등)을 실행하는 경우에만 관련이 있습니다.
응답에는 수정된 문서 수의 요약이 포함됩니다. 예를 들어 다음 응답은 파이프라인에서 세 개의 문서를 수정했음을 확인합니다.
{documents_modified: 3L}
제한사항
DML 단계는 Cloud Firestore Security Rules을 지원하지 않습니다. DML 작업 시도는 Cloud Firestore Security Rules을(를) 통해 거부됩니다.
이 기능의 미리보기 중에는 트랜잭션에서 DML 단계를 실행할 수 없습니다. 일관성 동작에 대한 자세한 내용은 일관성을 참조하세요.
DML 단계 앞의 단계에서 동일한
__name__으로 여러 문서를 생성하는 경우 각 인스턴스가 처리됩니다.update(...)의 경우 동일한 대상 문서가 여러 번 수정될 수 있습니다.delete(...)의 경우 첫 번째 시도 후의 후속 시도는 노옵스(no-ops)입니다.