#はじめに
Firebaseのデータベース**(今回はFirestoreの場合)**に入ってるデータの数を、カウントしたい時ってありますよね?
やり方は色々あるが、**どうせなら「最初から!」このやり方でやった方がいい!**というのを、記事として残していく。
Firebase で Cloud Functions を簡単にはじめよう
Cloud Functionsが一切わからない方は、こちらを参考に初めてみては?
#色々とあるカウント方法
Firestoreコレクションの全データ件数を取得する方法
こちらにて2つのカウント方法が紹介されている。
が「大量のデータの数を数えたい」という場合は今回の方法をお勧めする。
そして、理由は後記するが「最初から!」このやり方でやった方が良いかも。。
#データが登録されるタイミングで件数をカウントする
まず、onWrite
トリガーを使いeventsコレクション
以下を監視する。
(onWrite
トリガーについはこちらで詳しく解説されてます。)
そしてもし、データが増えていればusers/{userId}
にeventCountフィールドが作成され、そこにカウントがリアルタイムで溜まっていく。
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
const db = admin.firestore();
// // Start writing Firebase Functions
// // https://firebase.google.com/docs/functions/typescript
exports.countEvents = functions.region('asia-northeast1').firestore
.document('users/{userId}/events/{eventId}')
.onWrite((change, context) => {
const userId = context.params.userId;
const FieldValue = admin.firestore.FieldValue;
const countsRef = db.collection('users').doc(userId);
if (!change.before.exists) {
// 登録時に件数をインクリメント
return countsRef.update({ eventCount: FieldValue.increment(1) } );
} else if (change.before.exists && !change.after.exists) {
// 削除時に件数をデクリメント
return countsRef.update({ eventCount: FieldValue.increment(-1) });
}
return;
});
#あれ?なんでマイナスに?
上の画像、なんかおかしいですよね?
eventCount
がマイナスになるってあるの?
あるんです!!!
仮にusers/{userId}/events/
以下のコレクションに、すでに50件のドキュメントがあったとします。
新たにevent(events以下に生成される{eventId})が追加されても、カウントは「51」では無く、「1」となります。
つまり、50個あるevent(ドキュメント)を3つ削除すれば、eventCount
は-2となるのです。
最初からこのカウント方法でやっておけばよかった〜・・・っと後悔しないためにも、初めからこの方法でカウントしましょう。。。
元のデータも含めてカウントを開始するには、どうすればよいでしょうか?誰か教えてください
#参考
https://www.sukerou.com/2019/08/firestore.html