search
LoginSignup
9

More than 1 year has passed since last update.

posted at

Firebase 要素の数をカウントするなら、最初からこの方法でいきましょう!(Cloud Functions)

はじめに

Firebaseのデータベース(今回はFirestoreの場合)に入ってるデータの数を、カウントしたい時ってありますよね?

やり方は色々あるが、どうせなら「最初から!」このやり方でやった方がいい!というのを、記事として残していく。

Firebase で Cloud Functions を簡単にはじめよう
Cloud Functionsが一切わからない方は、こちら:point_up:を参考に初めてみては?

色々とあるカウント方法

Firestoreコレクションの全データ件数を取得する方法
:point_up:こちらにて2つのカウント方法が紹介されている。
が「大量のデータの数を数えたい」という場合は今回の方法をお勧めする。

そして、理由は後記するが「最初から!」このやり方でやった方が良いかも。。

データが登録されるタイミングで件数をカウントする

まず、onWriteトリガーを使いeventsコレクション以下を監視する。
onWriteトリガーについはこちらで詳しく解説されてます。)

そしてもし、データが増えていればusers/{userId}eventCountフィールドが作成され、そこにカウントがリアルタイムで溜まっていく。

index.ts
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;
  });

スクリーンショット 2020-04-17 13.13.33.jpg

あれ?なんでマイナスに?

上の画像、なんかおかしいですよね?
eventCountがマイナスになるってあるの?

あるんです!!!

仮にusers/{userId}/events/以下のコレクションに、すでに50件のドキュメントがあったとします。
新たにevent(events以下に生成される{eventId})が追加されても、カウントは「51」では無く、「1」となります。

つまり、50個あるevent(ドキュメント)を3つ削除すれば、eventCountは-2となるのです。
最初からこのカウント方法でやっておけばよかった〜・・・っと後悔しないためにも、初めからこの方法でカウントしましょう。。。

元のデータも含めてカウントを開始するには、どうすればよいでしょうか?誰か教えてください:frowning2:

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
9