Firestore でコレクションとサブコレクションを効果的に削除するにはどうすればよいですか?

DDD
リリース: 2024-10-28 12:51:30
オリジナル
763 人が閲覧しました

 How to Effectively Delete Collections and Subcollections in Firestore?

Firestore でのコレクションとサブコレクションの削除

Firestore を使用する場合、コレクションまたはサブコレクションを削除する必要があるシナリオが発生する場合があります。ただし、サブコレクションを格納する親ドキュメントを削除するには課題が伴います。この記事では、このような状況を効果的に管理する方法について説明します。

データベースの構造と削除の問題

各ドキュメントがリストを表す、「リスト」と呼ばれるコレクションを含むシナリオを考えてみましょう。一意の ID が付いています。各リスト ドキュメントには、「employees」および「locations」という名前のサブコレクションがあります。構造は次のとおりです。

(lists)
    -listId
       (employees)
       (locations)
ログイン後にコピー

ユーザーが特定のリストを削除したい場合、「listId」ドキュメントを削除すると、そのサブコレクションが保持され、Firestore のドキュメントに反します。

ソリューション: 順次削除

これに対処するために、次のような順次削除アプローチを提案します。

  1. 「employees」サブコレクション内のすべてのドキュメントを取得して削除します。
  2. 「locations」サブコレクションに対してこのプロセスを繰り返します。
  3. 最後に、「listId」ドキュメントを削除します。

このメソッドにより、特定のリストとそれに関連付けられたサブコレクションが完全に削除されます。

考慮事項

削除は効果的なツールですが、Firebase では、特に大規模なコレクションの場合は慎重に使用することを推奨しています。ただし、小規模なコレクションの場合は、削除が実行可能なオプションです。大規模なコレクションに対して削除を使用することが避けられない場合は、信頼できるサーバー環境で実行してください。

Android 用のコード実装

Android アプリケーションの場合、次のコードを使用して、削除プロセスを実装します:

private void deleteCollection(final CollectionReference collection, Executor executor) {
    Tasks.call(executor, () -> {
        int batchSize = 10;
        Query query = collection.orderBy(FieldPath.documentId()).limit(batchSize);
        List<DocumentSnapshot> deleted = deleteQueryBatch(query);

        while (deleted.size() >= batchSize) {
            DocumentSnapshot last = deleted.get(deleted.size() - 1);
            query = collection.orderBy(FieldPath.documentId()).startAfter(last.getId()).limit(batchSize);

            deleted = deleteQueryBatch(query);
        }

        return null;
    });
}

@WorkerThread
private List<DocumentSnapshot> deleteQueryBatch(final Query query) throws Exception {
    QuerySnapshot querySnapshot = Tasks.await(query.get());

    WriteBatch batch = query.getFirestore().batch();
    for (DocumentSnapshot snapshot : querySnapshot) {
        batch.delete(snapshot.getReference());
    }
    Tasks.await(batch.commit());

    return querySnapshot.getDocuments();
}
ログイン後にコピー

このコードはドキュメントをバッチで取得して削除し、コレクションとそのサブコレクションの両方を確実に削除します。

以上がFirestore でコレクションとサブコレクションを効果的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!