Firestore ardışık düzeni işlemleriyle verileri değiştirme

Belgeleri sorgulayabilen, ardından verileri silebilen veya değiştirebilen veri işlem hatları oluşturmak için update(...) ve delete(...) veri manipülasyon dili (DML) aşamalarını kullanın.

Sürüm gereksinimleri

Bu sayfada açıklanan işlemler için Firestore Enterprise sürümü gerekir.

Başlamadan önce

Ardışık düzen işlemleriyle bir veritabanına sorgu gönderme hakkında bilgi sahibi olmanız gerekir.

Dokümanları güncelleme

Belgeler için sorgu oluşturabilen ve ardından veri ekleyebilen veya değiştirebilen veri işlem hatları oluşturmak için update(...) DML aşamasını kullanın.

Tüm DML aşamaları, işlem hattının sonunda yer almalıdır. Bu aşamaya gelen dokümanlar, hangi dokümanların güncelleneceğini belirlemek için __name__ alanını içermelidir. Güncellemeye çalıştığınız dokümanlardan herhangi biri yoksa işlem başarısız olur.

Örneğin, aşağıdaki işlem bir koleksiyon grubundaki tüm belgelere bir veri modeli değişikliğini geri doldurur. Ardışık düzen, preferences.color alanını users koleksiyon grubundaki bu alanın eksik olduğu tüm belgelere ekler.

Node.js
const snapshot = await db.pipeline()
   .collectionGroup("users")
   .where(not(exists(field("preferences.color"))))
   .addFields(constant(null).as("preferences.color"))
   .removeFields("color")
   .update()
   .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Constant, Field, Not

snapshot = (
    client.pipeline()
    .collection_group("users")
    .where(Not(Field.of("preferences.color").exists()))
    .add_fields(Constant.of(None).as_("preferences.color"))
    .remove_fields("color")
    .update()
    .execute()
)
Java
Pipeline.Snapshot snapshot = firestore.pipeline()
   .collectionGroup("users")
   .where(not(exists(field("preferences.color"))))
   .addFields(constant((String) null).as("preferences.color"))
   .removeFields("color")
   .update()
   .execute().get();

Dokümanları silme

Belgeler için sorgu oluşturabilen ve ardından verileri silebilen veri ardışık düzenleri oluşturmak için delete(...) aşaması DML aşamalarını kullanın. Yanlışlıkla toplu silme işlemlerini önlemek için delete(...) ile biten işlem hatları en az bir where(...) aşaması içermelidir. Tüm DML aşamaları, işlem hattının sonunda yer almalıdır.

Örneğin, aşağıdaki ardışık düzen, address.users değeri USA olarak ayarlanmış ve __create_time__ değeri 10 günden az olan tüm users belgelerini 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();

Tutarlılık

update(...) ve delete() aşamaları içeren ardışık düzen işlemleri, bir işlem içinde desteklenmez. DML aşamaları, aşağıdaki davranışla bir işlemin dışında çalışır:

  • Her doküman bağımsız olarak güncellenir. Bu, işlemlerin dokümanlar arasında atomik olmadığı anlamına gelir. İşlem ilk hatada başarısız olur ve kısmi başarı mümkündür.
  • Aşağıdaki aşamalar desteklenir:
    • collection(...)
    • collection_group(...)
    • where(...)
    • select(...)
    • add_fields(...)
    • remove_fields(...)
    • let(...)
    • sort(...)
    • limit(...)
    • offset(...)
  • Aşağıdaki aşamalar desteklenmez:
    • aggregate(...)
    • distinct(...)
    • unnest(...)
    • find_nearest(...)
    • union(...), birleştirmeler ve alt sorgular gibi çok sorgulu aşamalara DML aşamasından önce izin verilmez.

Sınırlamalar

DML aşamalarıyla ilgili aşağıdaki sınırlamalara dikkat edin:

  • DML aşamaları, .execute() çağrılmadan önce bir ardışık düzen tanımındaki son aşamalar olmalıdır.
  • update(...) ve delete() aşamaları içeren ardışık düzen işlemleri, bir işlem içinde desteklenmez.
  • 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.