delete() یک مرحله از زبان دستکاری دادهها (DML) است که به یک پرسوجو اجازه میدهد اسناد را بر اساس نتایج یک پرسوجو حذف کند. این مرحله میتواند به انتهای یک پرسوجو پیوست شود و تمام اسنادی را که فیلد __name__ از مرحله قبلی به آنها ارجاع میدهد، حذف میکند.
مثالها
برای مثال، کوئری زیر تمام اسناد users را که address.users آنها روی USA تنظیم شده و __create_time__ آنها کمتر از 10 روز است، حذف میکند:
نود جی اس
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();
پایتون
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() )
جاوا
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();
برو
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() به مرحله ورودی مانند زیر امکانپذیر است:
نود جی اس
const results = await db.pipeline()
.collection("/users")
.delete()
.execute();
مطمئن شوید که مرحلهی where(...) قبل از delete() نهایی، اسناد را به درستی محدود میکند تا فقط اسناد مورد انتظار را بهروزرسانی کند. بهتر است ابتدا کوئری را بدون مرحلهی delete() نهایی اجرا کنید تا تأیید شود که فقط اسناد مورد نظر حذف میشوند.
مرحله نهایی
مرحلهی delete() باید در انتهای یک خط لوله قرار گیرد، هیچ مرحلهی دیگری نمیتواند ارائه شود.
حذف همه
به طور پیشفرض، مرحلهی delete() تمام اسنادی را که در مرحلهی قبل به آنها ارجاع داده شده است، حذف میکند. اگر میخواهید اندازهی حجم کار را محدود کنید، یا میدانید که شرایط فیلتر دقیقاً با یک سند مطابقت دارد، میتوانید قبل از delete() نهایی، یک limit(1) اضافه کنید تا کل کار محدود شود.
جهشهای مجموعه متقاطع
مرحلهی نهایی delete() جهشهایی را بر روی هر سندی که توسط __name__ ارجاع داده شده است اعمال میکند (با فرض اینکه تمام احراز هویتهای لازم ارائه شده باشد). این شامل حذف اسناد از چندین مجموعه یا گروه مجموعه مختلف به عنوان بخشی از یک درخواست واحد میشود.
__name__ الزامی
مرحلهی delete() مستلزم آن است که مرحلهی قبل یک فیلد __name__ ارائه دهد که حاوی ارجاع سندی برای حذف باشد. عدم انجام این کار منجر به خطای زمان اجرا خواهد شد و هنگامی که خارج از یک تراکنش اجرا شود، میتواند منجر به موفقیت نسبی شود.
بیشتر مراحل ورودی، مانند collection(...) ، collection_group(...) ، database(...) و documents(...) ، به طور پیشفرض شامل فیلد __name__ هستند، بنابراین این فقط در صورت استفاده از یک projection (مانند select(...) ) یا انجام تبدیل روی documents (مانند aggregate(...) ) مرتبط است.
پاسخ شامل خلاصهای از تعداد اسناد اصلاحشده است. برای مثال، پاسخ زیر تأیید میکند که خط لوله سه سند را اصلاح کرده است:
{documents_modified: 3L}
محدودیتها
مراحل DML Cloud Firestore Security Rules پشتیبانی نمیکنند. تلاشهای عملیات DML از طریق Cloud Firestore Security Rules رد میشوند.
در طول پیشنمایش این ویژگی، نمیتوانید مراحل DML را در یک تراکنش اجرا کنید. برای اطلاعات بیشتر در مورد رفتار سازگاری، به Consistency مراجعه کنید.
اگر مرحله قبل از مرحله DML، چندین سند با
__name__یکسان تولید کند، هر نمونه پردازش میشود. برایupdate(...)، این بدان معناست که یک سند هدف ممکن است چندین بار تغییر کند. برایdelete(...)، تلاشهای بعدی پس از اولین تلاش، بدون عملیات خواهند بود.