RTDBは、各データベースが単一の領域に対してローカルなので、これを行うことができます。シリアル化されたビューを提供するために、remove()
を呼び出すと、データベースは削除が完了するまで他のすべての作業を停止します。
この現象はいくつかの明らかな停止の原因となっています。remove()
コールで膨大な数のデータを削除する必要がある場合、他のすべてのアクティビティは完了するまで効果的にロックアウトされます。その結果、大量のデータを削除したいRTDBユーザであっても、グループ内の文書を再帰的に検索して削除することが推奨されています。
Firestoreは、さまざまなキー範囲が割り当てられている従来のGoogleスタイルのストレージインフラストラクチャに基づいています。ストレージは実際にはBigTableによってサポートされていませんが、同じ原則が適用されます。これは、データを削除することが、必ずしも単一のリージョンアクションではなくなったことを意味し、削除を効果的にトランザクションに見せかけることは非常に高価になります。 Firestoreの取引は現在100人に制限されています。これは、重要ではないトランザクションの一括削除が不可能であることを意味します。
私たちは、有望なトランザクション動作をせずに大量の削除を行うAPIをどのように表面化するのが最適かを調査しています。どのようにモバイルクライアントからこれを行うかを想像するのは簡単ですが、あなたが観察したように、私たちが行ったすべてが埋め込まれていて、あなたのためにバッチ削除ができれば、これは効率的ではありません。また、RESTクライアントを第2世代の市民にすることも望ましくありません。
Firestoreは新製品であり、まだまだたくさんのことがあります。残念ながら、これはちょうどカットをしていません。これは私たちが最終的に取り組むことを望むものですが、私はそれがいつ起こるかについてのタイムラインを提供することはできません。
一方、コンソールとfirebase command-lineは両方とも、これを行うための非トランザクション手段を提供します。テスト自動化のために。
Firestoreをお試しいただきありがとうございます。
Firestoreの文書(質問の@toofooによってリンクされている)の例が間違っていると思います。 'resolve() 'は'(numDeleted == 0) 'のときに呼び出されるべきです。 – Leo
現在、バッチとしてアップロードする必要がありますか?トランザクションを使用できますか? – Leo
そして別の質問。あなたは "有望なトランザクションの振る舞いなしに大量削除"を書いた。私はトランザクションの振る舞いが必要です。私はそれを望むことができますか? – Leo