Firebase Databaseで要素の数をカウントする方法

2019年7月31日水曜日

Database Firebase

t f B! P L

Firebase Databaseで要素の数をカウントする方法

Firebase Databaseで子要素の数をカウントする方法を紹介します。SQL文で言うところの、COUNT()文でレコード件数を取得する方法の、Firebase Databaseでのやり方です。

子要素のカウントを取る方法は、大きく以下の2つの方法があります。(他にもあるかもですが…)

# 内容
方法1 valueイベントで親要素の参照を取得して、
parent.numChildrenで子要素の数をカウント
方法2 Cloud Functionsでデータ書き込み時に子要素の数を集計

それぞれの方法について、以降で使い方やメリット・デメリットを解説します。

前提(環境など)

・この記事は、2019年7月時点の情報です。
・Javascript(Node.js)を使ったサンプルです。

方法1 parent.numChildrenで子要素カウント

1つ目の方法は、クライアントサイドSDKのnumChildren関数を使って子要素をカウントする方法です。

次のサンプルコードは、1行目で親要素/usersの参照を取得し、valueイベントの中で子要素の数をカウントする例です。

let firebase_node = firebase.database().ref('/users');
firebase_node.once('value', parent => alert('Count: ' + parent.numChildren()));

メリット

この方法のメリットは、何と言っても実装が簡単であることです。上のサプルコードを見ても分かる通り、たった2行で子要素の数をカウントできます。

デメリット

この方法デメリットは、データの件数を取得する為に、子要素のデータをすべてダウンロードすることです。データ件数が少ない場合は問題にはなりませんが、件数が膨大になると、通信量・処理速度共に重くなってしまいます。

方法2 Cloud Functions子要素の数を集計

2つ目の方法は、FirebaseのCloud Functionsでデータの更新をトリガーして、子要素の数を集計する方法です。サーバーサイドで処理する為、要素数(データ数)が膨大になる場合に有用な方法です。

次のサンプルコードでは、/users要素の変更をonWriteトリガーで監視し、ユーザの追加・変更・削除が行われた時に、子要素の数を再集計する例です。

//必要なモジュールをロードして、adminアプリ インスタンスを初期化
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.countUsers = functions.database.ref(`/users`).onWrite((change, context) => {
    //変更後のusers要素を取得
    const data = change.after.val();
    //子要素の数をカウント
    const count = Object.keys(data).length;
    //カウントした件数を、users_countに設定
    return change.after.ref.parent.child('users_count').set(count);
});

上のサンプルコードをデプロイして実際にユーザー情報を変更すると、次のイメージの通り、users_count要素に子要素をカウントした値が入ります。

FirebaseのCloud Functionsで子要素の件数を集計した結果

メリット

この方法のメリットは、Firebase上で件数の集計が行われるため、方法1のクライアントサイドで件数を取得するより高速です。大量のデータをページネーションをする時など、事前に件数を集計しておくことで高速に処理できます。

デメリット

クライアントサイドの処理とは別に、Cloud Functionsのスクリプトを作成する必要があり、手間と管理が少し面倒です。ただ、子要素の数が膨大になる場合は、この方法で子要素のカウントを取るのが無難です。

さいごに

Firebase Databaseで要素の数をカウントする方法を紹介してきました。子要素の数をカウントする要件なんてよくありそうですが、Firebaseでは割と面倒です。

ベストな方法を知っている人が居たら、ぜひご指摘ください。

スポンサーリンク

QooQ