Copyright © 2020 さいけの技術ブログ All Rights Reserved. そこで、1分ごとのクーロンを回して、実行したタイミングの日時に一致するリマインダーがFirestoreのドキュメントに存在したら、それをもとにリマインダー通知するという実装にしました。, 実際のコード(TypeScript)はこちらです。途中、型の変換などしてますが、概ねの流れは掴めると思います, 関数の実行後、Timestamp.now() で日時を取得したところ、秒単位で誤差があったので、秒単位で日時の比較をするとアプリ側で登録した時間とズレるため、秒を切り捨てる処理をしてから比較をしています。 firestoreを勉強するようになり、firebaseのdatabaseとドキュメントを混在することがよくあったので、自分の備忘録として残しておこうと思いました。, また、ここではFirestoreにデータを保存、更新、削除、リッスンの内容のみを書きます。そのため導入方法などは他の記事でお願いします。, somethingで特定のコレクション?データ群(どういう名前かわからないので、教えてください)にアクセスできます。, Firestoreのドキュメントなどでは下のように参照できるようにしてありました。, この2つの違いとしては、addメソッドでは作成時に一意なIDを自動作成してくれます。idにアクセスしたいときは.thenを使うといいかと、、、。, 一方でsetメソッドはdocと一緒に用いることによって、ドキュメント名を指定することができます。データを一覧として取得したいときなどに便利です。, 下のコードはFirestoreの公式ドキュメントより引用。https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja, またこの時にdoc()←このように何も指定しないときはaddメソッドと同じように一意なidを作成します。, データの更新はupdateメソッドを使用します。引数に渡したオブジェクトで指定したプロパティについてデータを上書き(更新)します。, 先ほどのaddメソッドの時に使ったコードの一部になりますが、doc()によって特定のドキュメントを指定し、idプロパティをドキュメント作成時のidに更新しています。, データの削除はdeleteメソッドで行います。updateの時と同様に特定のドキュメントを指定し、deleteメソッドを実行します。, 下のコードはFirestoreの公式ドキュメントより引用。https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ja, firestoreまたdatabaseの醍醐味であるデータをリアルタイムでリッスンするためにはonSnapshotを使用します。, これは1度だけデータを取得するget()メソッドとは異なるので注意してください。(間違えて覚えていた人は自分しかいないはず、、、。), またquerySnapshotに今回の場合はmemosデータが入っている?(ここについても間違っていたら教えてください), そのためにforEachによってそれぞれのデータを取得し、memosにプッシュしています。, そして.whereメソッドで条件を指定した時でもonSnapshotで大丈夫です。(当たり前のことを言っていくスタイル), 下のコードはFirestoreの公式ドキュメントより引用。https://firebase.google.com/docs/firestore/query-data/listen?hl=ja, Firebaseのコードは簡単にデータを保存できますが、やっぱり取り掛かりは難しいですね。ほぼドキュメントのコピペに頼っている人生です。. ここら辺のパフォーマンスに関して現在はリマインダーの数が少なく問題になっていません。詳しくは、monoさんsu-さんにツイートいただいた内容の方が参考になるのでそちらを見てください。, このセクションについてはアプリの仕様によりけりと思いますので参考程度に見てください。, 先のリマインダー通知処理で参照するreminders/配下のドキュメントの準備について説明します。 nodeをインストールしている; googleアカウントを持っている; そもそもCloud Functions for Firebaseって? ユーザーが登録したTODO自体はセキュリティルールの関係上、families/{familyID}/tasks/に保存しています。そのTODO内にリマインダーが設定されていたら、トリガーイベントでreminders/配下にドキュメントコピーしています。, コレクショングループクエリでtasks/にクエリを実行してremindAtのフィールドが現在時刻のドキュメントを取得する方法も考えましたが、tasks/の総数がすでに1万件を超えているため、このアプローチは辞めました。リマインダーが確実に存在するreminders/の件数はtasks/の1/10以下なので省エネです。 Qiita Jobsで転職すると、お祝い金30万円がもらえるキャンペーンを実施中!, https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja, https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ja, https://firebase.google.com/docs/firestore/query-data/listen?hl=ja, you can read useful information later efficiently. By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. Help us understand the problem. https://cloud.google.com/scheduler/pricing?hl=ja, コスト面やPub/Subの割り当て上限を考慮すると、単純にユーザーのリマインダーごとにCron Jobを作ることは現実的ではないことがわかります。 // ユーザーのトークンは複数ある可能性があるので、ユーザーのトークン分メッセージを作る, // 500件ずつに分割する(500件以上は、sendAllメソッド側でエラーになるため), https://firebase.google.com/docs/functions/schedule-functions, https://cloud.google.com/scheduler/pricing?hl=ja, 完了済みフラグの立っていないリマインダーが1件以上あったら、FCMのPUSH通知を実行, you can read useful information later efficiently. Firebaseはもともとは独立したサービスでしたがGoogleに買収されGCPのサービスの仲間入りをしました。このような背景からFirebaseはGCPの他のサービスと違ってFirebaseのプロジェクトを作成したり専用のコンソールが用意されいたりします。今回はFirebaseのデモプロジェクトから、画面の見方につい … 内部的には、GCPのCloud Pub/Subトピックが作成され、Cloud SchedulerのCronを使用してこのトピックに関するイベントがトリガーされる仕組みです。, 詳しくは公式ドキュメント参照 招待リンクをパートナーにLINEなどで送って、参加してもらうだけで、TODOをリアルタイムで共有できるようになります。. そのため500件ごとに通知の配列を区切ってからsendAllに渡して実行してます。, 実行する通知の件数が多い場合、メモリ不足が懸念されるため512MBまでメモリ上限を引き上げています。Promise.allを使って並列処理をしていますが、1秒ごとに処理が完結しても1分で30,000件送れるので直列実行で良いかもしれません。 毎分クーロンが走ると年間で525,600回クエリが実行されるので負荷を極力減らしたい意図があります。, とあり、リマインダー用途には要件的に難しそうです。 この記事はFirebaseアドベントカレンダー 22日目の記事です。 元ラーメン屋店長プログラマのObjective-ひろC(@hirothings)です個人開発したTODOアプリでCloud Functionsのスケジュール関数 + Firestore + FCM (Firebase Cloud Messaging)でリマインダーを実装しました。 FCMの記事はたくさんあ … はじめに こんにちは!さいけです。 本記事は、「SpringBoot x Lombok構成でJSONを返却する方法」について紹介します。 前提 IntelliJ IDEAでLombokが有効設定になっている設定して... はじめに curlでリクエストヘッダーを指定する方法を紹介します。 備忘録的な記事になります。 curlでリクエストヘッダーを指定する 下記、サンプルコマンドでリクエストヘッダーを指定できます。 単数指定 ... はじめに こんにちは!さいけです。 本記事は、Spring Boot x Gradle x IntelliJ IDEA構成でHelloWorldをするやり方を紹介します。 チュートリアルみたいな記事になっています。 ... はじめに こんにちは!さいけです。 今回は、「webから取得したjsonレスポンスの差分を比較する方法」について紹介します。 webから取得したjsonレスポンスの差分を比較する方法 webから取得したjsonレス... はじめに 本記事は、「IntelliJ IDEAのショートカットキーでコードフォーマットする方法」を紹介します。 備忘録的な記事になります。 IntelliJ IDEAのショートカットキーでコードフォーマットする... はじめに こんにちは!さいけです。 今回は、「負荷ツールを利用して「socket: Too many open files」のエラーが出た場合の解決方法」について紹介します。 備忘録的な記事になります。 負荷ツール... はじめに こんにちは!さいけです。 今回は、タイトルの通りちょっとだけ実用性のあるgitのaliasコマンドを作ってみる記事になります。 紹介するaliasコマンドは以下、2つです。 git statusを行うal... はじめに こんにちは!さいけです。 今回は、「Node.jsの変更を検知してアプリケーションを自動で再起動する方法」を紹介します。 前提 Node.jsが端末にインストールされている Node.jsの変更を検... はじめに こんにちは!さいけです。 今回は「簡単にローカル環境でJSONモックサーバーを作成する方法」を紹介します! 備忘録的な記事になります。 簡単にローカル環境でJSONモックサーバーを作成する方法 js... はじめに こんにちは!さいけです。 今回は「ディレクトリ内にあるファイル数を取得する方法」を紹介します! 備忘録的な記事になります。 ディレクトリ内にあるファイル数を取得する方法 findコマンドとwcコマン... flutter doctorでIntellij IDEAの依存関係が認識されない場合の解決方法, いい感じのgitignoreが欲しくなったときに使える便利なgitignoreテンプレート.
エブリィ チョイ上げ バンパー, 色鉛筆 48色 トンボ, Mac 通信速度 高速化クリッピングマスク 複数 Photoshop, 婚姻届 証人 住所 間違い, Line 携帯紛失 本人確認, ダイソー 防水テープ 医療, 英語辞書 おすすめ 中学生, 管理者として実行 表示 されない Bat, ダイソー パステル 蛍光色, きゅうり 育て方 プランター, キーエンス 海外 事業 比率, Photoshop カラーピッカー 常に表示, 時制 英語 Tense, 東芝 テレビスピーカー 音が出ない, 札幌 秋 イベント, 好き じゃ ない 付き合う 辛い, ディスガイアrpg 経験値 修羅, 契約書 1枚 割印, 楓 季節 着物, トランプ スピード 掛け声, Ipad カメラロール 動画 再生できない, ダイソー パステル 蛍光色, イラレ 中心線 図面, 管理者権限 解除 Windows10, Outlook 差出人 表示 メールアドレス, リモート ワーク 資格 なし, 車 ブレーキペダル 重い, K-pop ライブ 2020 東京,