Firebase v8 から v9 への Firestore クエリのアップデート

はじめに

こんにちわ!こんばんわ!ご観覧ありがとうございます。
定期的に雑色な記事を投稿します。(タイトルは記事のメインの内容にしてますが)
基本的には抱えている問題を改善し、改善方法を記事にしてアップしようと考えています。

お題と経緯

Firebaseを使用した案件に携わってますが、ちょうどv8しかなく、初めてすぐにv9がリリースされました。
いつかいつかv9に移行せねばということで、今回重い腰を上げた次第です。
参考になる記事があまりなかったので、メモ程度に記事にします!

今回の内容

とりあえず、Queryからまとめます。
Firestoreからデータを取得する際につかうcollectionとdocのv8→v9の書き方の違いについてです。

初期設定

v8

import firebase from 'firebase/app';
import 'firebase/firestore';

const config = {
  ...YOUR_CONFIG
};

firebase.initializeApp(config);
const db = firebase.firestore();


v9 モジュールベースの初期化ですね。

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

const config = {
  ...YOUR_CONFIG
};

const app = initializeApp(config);
const db = getFirestore(app);

Firestoreクエリと実行(collection)

v8

const query = db.collection('users').where('age', '>=', 18);
query.get().then((querySnapshot) => {
  querySnapshot.forEach((doc) => {
    console.log(doc.id, ' => ', doc.data());
  });
});


v9 whereなどimportがいります。

import { collection, query, where } from 'firebase/firestore';
import { getDocs } from 'firebase/firestore';

const q = query(collection(db, 'users'), where('age', '>=', 18));
getDocs(q).then((querySnapshot) => {
  querySnapshot.forEach((doc) => {
    console.log(doc.id, ' => ', doc.data());
  });
});

query側をgetDocsの引数にしてますね。

Firestoreクエリと実行(doc)

v8

const docRef = db.collection('users').doc('user_id');
docRef.get().then((doc) => {
  if (doc.exists) {
    console.log('Document data:', doc.data());
  } else {
    console.log('No such document!');
  }
});

v9 getDocなので注意!collectionはgetDocsです。

import { getDoc, doc } from 'firebase/firestore';

const userDocRef = doc(db, 'users', 'user_id');
const docSnap = await getDoc(userDocRef);

if (docSnap.exists()) {
  console.log('Document data:', docSnap.data());
} else {
  console.log('No such document!');
}

補足ですが、自分の開発環境だとなぜかdocの第一引数の型が合いませんでした。

    function doc(firestore: types.FirebaseFirestore, path: string, ...pathSegments: string[]): DocumentReference<DocumentData>;
    function doc<T>(reference: types.CollectionReference<T>, path?: string, ...pathSegments: string[]): DocumentReference<T>;
    function doc(reference: types.DocumentReference<unknown>, path: string, ...pathSegments: string[]): DocumentReference<DocumentData>;

docの受け取れる型で、一番上が該当するはずなのになんでやんねん!と思ってたら、vscode再起動で治ってました。
どっちにしろなんでやねん!
だいぶ困惑してましたね、でもよかった。

まとめ

印象としては結構変わってました。
モジュールベースのアプローチに切り替わっていて、今風?なのかなという印象です。
いつかCreate,Update,Deleteもまとめたいと思います。(ほぼ自分のため)
以上ありがとうございました!!!