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上で件数の集計が行われるため、方法1のクライアントサイドで件数を取得するより高速です。大量のデータをページネーションをする時など、事前に件数を集計しておくことで高速に処理できます。
デメリット
クライアントサイドの処理とは別に、Cloud Functionsのスクリプトを作成する必要があり、手間と管理が少し面倒です。ただ、子要素の数が膨大になる場合は、この方法で子要素のカウントを取るのが無難です。
スポンサーリンク
さいごに
Firebase Databaseで要素の数をカウントする方法を紹介してきました。子要素の数をカウントする要件なんてよくありそうですが、Firebaseでは割と面倒です。
ベストな方法を知っている人が居たら、ぜひご指摘ください。
0 件のコメント:
コメントを投稿