【Firestore v9】dateフォームの値を入れるとtimestamp型ではなくstring型と判断されてしまう問題の解決方法

最近Firebaseを使って簡単なウェブアプリを作るのにチャレンジしたのですが、Firestoreのtimestamp型に癖があって苦労しました。

特に困ったのがdateフォームからのデータを入力するときで、そのまま値を入れたらstring型と判断されて「あれ?」となりました。色々と調べてみたら解決したので、以下にまとめておきます。

ちなみにこちらの記事はFirestore v9のお作法で書いていますが、v8で書いている方は逐次v8バージョンにリライトをお願いします。

Timestamp.fromDate()で変換する

※ここでは↓にあるいつものFirebase、Firestoreの初期化は終わっている前提で進めます。

import { initializeApp } from "firebase/app";
import { getFirestore } from "firebase/firestore";

例えば誕生日(birthday)をフォームから受け取ってFirestoreに保存する場合は

<input type="date" name="birthday" value="">

firestoreからTimestampをインポートして…

import { Timestamp } from "firebase/firestore";

受け取った値を変数birthdayに格納したとしたら、以下の書き方でtimestamp型へ変換することができます。

Timestamp.fromDate(new Date(birthday))

色んな方法を試しては「なんでstring型で保存されてしまうんだー!」と叫んでいましたが、答えは意外とシンプルでした。公式のドキュメントを読んでおけば終わりだったという。

https://firebase.google.com/docs/reference/node/firebase.firestore.Timestamp

この記事の趣旨とは関係ないんですがFirebase本当に便利ですね。FirestoreがNoSQLなので集計周りが弱いのが難点だなと思っていたのですがBigQuery使えばなんとかなりますし、セキュリティ周りの実装もシンプルでわかりやすいのでさっとアプリを作りたいときは重宝します。

関連記事

年収アッププログラミング

【MySQL】AUTO_INCREMENTとPRIMARY KEYを同時に設定する方法

CREATE TABLE時にidへAUTO_INCREMENTとPRIMARY KEYを設定するのは定番だと思うのですが、最近はフレームワークを使ってテーブルを作るため、いざSQLを書いて作ろうとすると忘れがち。 今回は自分の名前とメールアドレスを格納するuser...