【Firestore】count, sum, average の集計クエリを活用する

Firestoreにて集計クエリはV9から利用可能です。NoSQLの性質上、事前に集計しておくなど、実装上で工夫する必要がありましたが、現在は集計クエリがサポートされています。

2024年02月21日
関連記事
  • メモ程度に書き残しておきます。
  • Firebase v9で動作

count

指定されたコレクションまたはクエリ内のドキュメント数をカウントします。これは、特定の条件に一致するドキュメントの総数を知りたい場合に。

const coll = collection(db, "cities");
const snapshot = await getCountFromServer(coll);
console.log('count: ', snapshot.data().count);

sum

特定の数値フィールドの合計値を計算します。コレクション内のすべてのドキュメントに含まれる特定の数値フィールド(この例ではpopulation)の合計を求めるのに使用します。

const coll = collection(firestore, 'cities');
const snapshot = await getAggregateFromServer(coll, {
  totalPopulation: sum('population')
});
console.log('totalPopulation: ', snapshot.data().totalPopulation);

average

特定の数値フィールドの平均値を計算します。コレクション内のドキュメントに含まれる数値フィールドの平均値を求める際に。

const coll = collection(firestore, 'cities');
const snapshot = await getAggregateFromServer(coll, {
  averagePopulation: average('population')
});
console.log('averagePopulation: ', snapshot.data().averagePopulation);

注意点

  1. リアルタイムリスナーやオフラインクエリでは使用できません。
  2. sumとaverageは数値のみ有効。それ以外は無視されます。
  3. 対象が1000ドキュメントに対して1Readとして課金される。

数百万など、大量のドキュメントが対象の場合は注意が必要です。
※ 大した課金額にはならないけど、頭に入れた方がいい

課金の具体例

  • 0~1,000個のインデックスエントリ
    例えば、count()クエリで対象となるドキュメント数が0~1,000個の場合、これは1回のドキュメント読み取りとして課金されます。

  • 1,500個のインデックスエントリ:
    もしcount()クエリで対象となるドキュメント数が1,500個の場合、これは2回のドキュメント読み取り(1,000個のバッチが1つと、残りの500個のバッチが1つ)として課金されます。

筆者情報
IT業界経験6年目のフルスタックエンジニア。
フロントエンドを軸として技術を研鑽中でございます。