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(...)vedelete()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.