7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

#はじめに
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:

#参考
https://www.sukerou.com/2019/08/firestore.html

7
8
0

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
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?