Firestoreメモ
メモをまとめていく。正しいかどうかは保証しない。
データモデル
Documentはユニークである。Firestoreに任せて自動でも作成可能。
Collectionの下にCollection、Documentの下にDocumentは作成不可。
Documentの中はField(Key: Valueのセット)が並ぶ。構造的にはほぼjsonと考えてよい。Mapという形でネストも可能。Map内のフィールドはSub Field。
Documentの下のSub Collectionを作成可能で、100層くらいまでは作成可能。
コードからデータを取得する場合は、Collection, Documentに対して、「リファレンス(Reference)」を作成しする。リファレンスはDocumentなどの場所を表すObject。
CollectionとDocumentでリファレンスは違うものが用意されている。
const ref = db.doc("collection/document1")
みたいに取れる。
Sub Collection
親のDocmentが消えても子のSub Collectionは消えない。
Index
データベースのインデックスはデータベース内のアイテムをデータベース内の場所にマッピングします。
Cloud Firestore では、すべてのクエリに対してインデックスを使用することで、クエリの高パフォーマンスを確保します。結果的に、クエリのパフォーマンスは、データベース内のアイテム数ではなく、結果セットのサイズに依存することになります。
単一フィールド インデックス
単一フィールド インデックスは、特定の 1 つのフィールドを含む、コレクション内のすべてのドキュメントの並べ替え済みマッピングを保持します。単一フィールド インデックスの各エントリには、ドキュメント内の特定のフィールドの値と、そのドキュメントのデータベース内での位置が記録されます。Cloud Firestore はこうしたインデックスを使用して、多くの基本的なクエリを実行します。データベースの自動インデックスの設定とインデックス除外を構成して、単一フィールド インデックスを管理します。
自動インデックス
デフォルトでは、Cloud Firestore はドキュメント内のフィールドおよびマップ内のサブフィールドごとに単一フィールド インデックスを自動的に維持します。
複合インデックス
複合インデックスには、インデックスを作成するフィールドの順序付きリストに基づいて並べ替えられた、コレクション内のすべてのドキュメントのマッピングが格納されます。
Cloud Firestore では複合インデックスを使用して、単一フィールド インデックスではサポートされないクエリをサポートします。
Index登録の例
トランザクション
トランザクション関数内でアプリケーションのステータスを変更しないでください。トランザクション関数は複数回実行されることがあり、UI スレッドに対して実行される保証がないため、変更すると同時実行の問題が発生します。代わりに、トランザクション関数から必要な情報を渡します。
正しくは、
import { doc, runTransaction } from "firebase/firestore";
// Create a reference to the SF doc.
const sfDocRef = doc(db, "cities", "SF");
try {
const newPopulation = await runTransaction(db, async (transaction) => {
const sfDoc = await transaction.get(sfDocRef);
if (!sfDoc.exists()) {
throw "Document does not exist!";
}
const newPop = sfDoc.data().population + 1;
if (newPop <= 1000000) {
transaction.update(sfDocRef, { population: newPop });
return newPop;
} else {
return Promise.reject("Sorry! Population is too big");
}
});
console.log("Population increased to ", newPopulation);
} catch (e) {
// This will be a "population is too big" error.
console.error(e);
}
トランザクションの失敗
トランザクションが失敗する可能性のある原因を次に示します。
トランザクションで書き込みオペレーションの後に読み取りオペレーションが実行される(読み取りオペレーションは常に、書き込みオペレーションの前に実行する必要があります)。
トランザクションが、トランザクション外部で変更されたドキュメントを読み取る(この場合、トランザクションは自動的に再実行され、一定の回数で再試行されます)。
トランザクションが最大リクエスト サイズである 10 MiB を超えている。
トランザクションのサイズは、トランザクションによって変更されたドキュメントとインデックス エントリのサイズによって異なります。削除オペレーションの場合、トランザクションのサイズには、対象ドキュメントのサイズと、オペレーションに伴い削除されるインデックス エントリのサイズが含まれます。
トランザクションが失敗するとエラーが返され、データベースには何も書き込まれません。トランザクションをロールバックする必要はありません。これは Cloud Firestore により自動的に実行されます。