تغییر داده‌ها با عملیات Firestore Pipeline

از مراحل update(...) و delete(...) زبان دستکاری داده‌ها (DML) برای ساخت خطوط لوله داده‌ای استفاده کنید که می‌توانند برای اسناد پرس‌وجو کنند و سپس داده‌ها را حذف یا تغییر دهند.

الزامات نسخه

عملیات شرح داده شده در این صفحه نیاز به نسخه Firestore Enterprise دارد.

قبل از اینکه شروع کنی

شما باید با نحوه پرس و جو از پایگاه داده با عملیات Pipeline آشنا باشید.

به‌روزرسانی اسناد

از مرحله update(...) DML برای ساخت خطوط لوله داده استفاده کنید که می‌توانند برای اسناد پرس‌وجو کنند و سپس داده‌ها را اضافه یا تغییر دهند.

تمام مراحل DML باید در انتهای خط لوله قرار گیرند. اسنادی که به این مرحله وارد می‌شوند باید شامل فیلد __name__ باشند تا مشخص شود کدام اسناد باید به‌روزرسانی شوند. اگر هر یک از اسنادی که سعی در به‌روزرسانی آنها دارید وجود نداشته باشند، عملیات با شکست مواجه می‌شود.

برای مثال، عملیات زیر یک تغییر مدل داده را برای تمام اسناد موجود در یک گروه مجموعه، دوباره پر می‌کند. این خط لوله، فیلد preferences.color را به تمام اسناد موجود در گروه مجموعه users که آن فیلد را ندارند، اضافه می‌کند.

نود جی اس
const snapshot = await db.pipeline()
   .collectionGroup("users")
   .where(not(exists(field("preferences.color"))))
   .addFields(constant(null).as("preferences.color"))
   .removeFields("color")
   .update()
   .execute();
پایتون
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()
)
جاوا
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();

حذف اسناد

از مراحل DML مربوط به مرحله delete(...) برای ساخت خطوط لوله داده استفاده کنید که می‌توانند اسناد را جستجو کرده و سپس داده‌ها را حذف کنند. برای جلوگیری از حذف‌های تصادفی و فله‌ای، خطوط لوله‌ای که به delete(...) ختم می‌شوند باید حداقل شامل یک مرحله where(...) باشند. تمام مراحل DML باید در انتهای خط لوله قرار گیرند.

برای مثال، خط لوله زیر تمام اسناد 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();

ثبات

عملیات خط لوله با مراحل update(...) و delete() در یک تراکنش پشتیبانی نمی‌شوند. مراحل DML خارج از یک تراکنش با رفتار زیر اجرا می‌شوند:

  • هر سند به طور مستقل به‌روزرسانی می‌شود. این بدان معناست که عملیات در بین اسناد به صورت اتمیک انجام نمی‌شود. عملیات با اولین خطا شکست می‌خورد و موفقیت جزئی امکان‌پذیر است.
  • مراحل زیر پشتیبانی می‌شوند:
    • collection(...)
    • collection_group(...)
    • where(...)
    • select(...)
    • add_fields(...)
    • remove_fields(...)
    • let(...)
    • sort(...)
    • limit(...)
    • offset(...)
  • مراحل زیر پشتیبانی نمی‌شوند:
    • aggregate(...)
    • distinct(...)
    • unnest(...)
    • find_nearest(...)
    • مراحل چند پرس‌وجویی مانند union(...) ، joins و زیرپرس‌وجوها قبل از یک مرحله DML مجاز نیستند.

محدودیت‌ها

به محدودیت‌های زیر برای مراحل DML توجه کنید:

  • مراحل DML باید آخرین مراحل در تعریف خط لوله قبل از فراخوانی .execute() باشند.
  • عملیات خط لوله با مراحل update(...) و delete() در یک تراکنش پشتیبانی نمی‌شوند.
  • اگر مرحله قبل از مرحله DML، چندین سند با __name__ یکسان تولید کند، هر نمونه پردازش می‌شود. برای update(...) ، این بدان معناست که یک سند هدف ممکن است چندین بار تغییر کند. برای delete(...) ، تلاش‌های بعدی پس از اولین تلاش، بدون عملیات خواهند بود.