削除

delete() は、クエリの結果に基づいてクエリがドキュメントを削除できるようにするデータ操作言語(DML)ステージです。このステージはクエリの末尾にアタッチでき、前のステージの __name__ フィールドが参照するすべてのドキュメントを削除します。

たとえば、次のクエリは、users ドキュメントのうち、 address.usersUSA に設定され、__create_time__ が 10 日未満のすべてのドキュメントを削除します。

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)

行動

レスポンス

delete() ステージは常に、削除されたドキュメントの数を記述する { documents_modified: 28L } のような単一のドキュメントを出力します。

コレクション全体の削除

コレクションからすべてのドキュメントを削除するには、次のように入力ステージに delete() を追加します。

Node.js

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

最後の delete() の前の where(...) ステージで、ドキュメントが適切に制限され、想定されるドキュメントのみが更新されるようにします。意図したドキュメントのみが削除されることを検証するには、最初に最後の delete() ステージなしでクエリを実行することをおすすめします。

最終ステージ

delete() ステージはパイプラインの最後に配置する必要があります。これ以上のステージを指定することはできません。

すべてを削除

デフォルトでは、delete() ステージは前のステージで参照されているすべてのドキュメントを削除します。ワークロードのサイズを制限する場合や、フィルタ条件が 1 つのドキュメントと完全に一致することがわかっている場合は、最後の delete() の前に limit(1) を追加して、合計作業量を制限できます。

コレクション間のミューテーション

最後の delete() ステージは、__name__ で参照されるすべてのドキュメントにミューテーションを適用します(必要な認証がすべて提供されている場合)。 これには、同じリクエストの一部として、複数の異なるコレクションまたはコレクション グループからドキュメントを削除することも含まれます。

__name__ が必要

delete() ステージでは、前のステージで削除するドキュメント参照を含む __name__ フィールドを指定する必要があります。指定しないと、ランタイム エラーが発生し、トランザクションの外部で実行すると部分的に成功する可能性があります。

`collection(...)`、`collection_group(...)`、`database(...)`、`documents(...)` などのほとんどの入力ステージには、デフォルトで `__name__` フィールドが含まれているため、これは射影(`select(...)` など)を使用する場合や、ドキュメントに対して変換(`aggregate(...)` など)を実行する場合にのみ関連します。collection(...)collection_group(...)database(...)documents(...)__name__select(...)aggregate(...)

レスポンスには、変更されたドキュメント数の概要が含まれます。 たとえば、次のレスポンスは、パイプラインが 3 つのドキュメントを変更したことを確認します。

{documents_modified: 3L}

制限事項

  • DML ステージは Cloud Firestore Security Rules をサポートしていません。DML オペレーションの試行 Cloud Firestore Security Rulesは拒否されます。

  • この機能のプレビュー期間中は、トランザクションで DML ステージを実行できません。整合性の動作の詳細については、 整合性をご覧ください。

  • DML ステージの前のステージで、同じ __name__ を持つ複数のドキュメントが生成された場合、各インスタンスが処理されます。update(...) の場合、同じターゲット ドキュメントが複数回変更される可能性があります。delete(...) の場合、最初の試行後の試行は no-op になります。