Sil

delete(), bir sorgunun sonuçlarına göre belgeleri kaldırmasına olanak tanıyan bir veri manipülasyon dili (DML) aşamasıdır. Bu aşama, sorgunun sonuna eklenebilir ve önceki aşamadaki __name__ alanının referans verdiği tüm belgeleri siler.

Örnekler

Örneğin, aşağıdaki sorgu, address.users değeri USA olarak ayarlanmış ve __create_time__ değeri 10 günden az olan tüm users dokümanlarını siler:

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)

Davranış

Yanıt

delete() aşaması, her zaman kaç dokümanın silindiğini açıklayan { documents_modified: 28L } gibi tek bir doküman yayınlar.

Koleksiyonun Tamamını Silme

Bir koleksiyondaki tüm dokümanları silmek için giriş aşamasına delete() ekleyebilirsiniz. Örneğin:

Node.js

const results = await db.pipeline()
  .collection("/users")
  .delete()
  .execute();

Son delete() aşamasından önceki where(...) aşamasının, dokümanları yalnızca beklenen dokümanları güncelleyecek şekilde doğru sınırlandırdığından emin olun. Yalnızca amaçlanan belgelerin kaldırıldığını doğrulamak için sorguyu önce son delete() aşaması olmadan çalıştırmak iyi bir uygulamadır.

Son Aşama

delete() aşaması, bir ardışık düzenin sonunda yer almalıdır. Başka aşama sağlanamaz.

Tümünü Sil

Varsayılan olarak delete() aşaması, önceki aşamada referans verilen tüm dokümanları kaldırır. İş yükünün boyutunu sınırlamak istiyorsanız veya filtre koşullarının tam olarak bir dokümanla eşleştiğini biliyorsanız toplam işi sınırlamak için son delete()'den önce limit(1) eklenebilir.

Koleksiyonlar Arası Değişiklikler

Son delete() aşamada, __name__ tarafından referans verilen tüm belgelerde değişiklikler uygulanır (gerekli tüm kimlik doğrulama bilgilerinin sağlandığı varsayılır). Aynı isteğin parçası olarak birden fazla farklı koleksiyondan veya koleksiyon grubundan doküman silme de buna dahildir.

__name__ Gerekir

delete() aşamasında, önceki aşamada kaldırılacak bir belge referansı içeren __name__ alanı sağlanması gerekir. Bunu yapmazsanız çalışma zamanı hatası oluşur ve işlem dışında çalıştırıldığında kısmi başarı elde edilebilir.

collection(...), collection_group(...), database(...) ve documents(...) gibi çoğu giriş aşamasında __name__ alanı varsayılan olarak bulunur. Bu nedenle, yalnızca select(...) gibi bir projeksiyon kullanılıyorsa veya dokümanlarda aggregate(...) gibi bir dönüştürme işlemi gerçekleştiriliyorsa geçerlidir.

Yanıt, değiştirilen belge sayısının özetini içerir. Örneğin, aşağıdaki yanıt, ardışık düzenin üç belgeyi değiştirdiğini onaylar:

{documents_modified: 3L}

Sınırlamalar

  • DML aşamaları Cloud Firestore Security Rules özelliğini desteklemez. Cloud Firestore Security Rules üzerinden DML işlemi denemelerine izin verilmez.

  • Bu özelliğin önizleme sürümü sırasında bir işlemde DML aşamalarını çalıştıramazsınız. Tutarlılık davranışı hakkında daha fazla bilgi için Tutarlılık başlıklı makaleyi inceleyin.

  • DML aşamasından önceki aşamada aynı __name__ ile birden fazla doküman oluşturulursa her örnek işlenir. update(...) için bu, aynı hedef dokümanın birden çok kez değiştirilebileceği anlamına gelir. delete(...) için ilk denemeden sonraki denemeler işlem yapmaz.