firestoreはフロントエンドエンジニアが個人でwebサービスを作る際に、わざわざデータベースを一から作っていく必要がなく、数行のコードでデータを保存したり、取得したりととても便利なサービスです。
ただ、使いはじめの頃、必ずと言っていいほどidのわからない(または自動で付与されたidの)documentをどうやって取得するのか
という壁が立ちはだかります。
公式ドキュメントではfirebase.firestore.collection("cities").doc("SF").get()
で取得できると書いてあるけど、この例でのSFと言うidがそれ以外、もしくは複数のドキュメントをgetしたい場合にはどうすればいいのかと言う話です。
結論:docを使わなくてもdocumentの取得は可能
公式リファレンスをみていただければわかると思いますが、データの取得に使うget()メソッド
は返り値としてQuerySnapshot
を返します。
このQuerySnapshot
はdocumentのid
を持っていますし、このsnapshotからdocumentを取り出すことが可能です。
documentの取り出し方の一例を紹介
ここでは僕のパターン(React)を紹介します。
const getPosts = () => {
//空の配列postsを準備します
let posts = []
//firebaseお決まりのメソッドでコレクションからデータを取ってきます
//ここでのポイントは「doc()がいらないこと」です
db.collection('posts').get()
//getしたデータに対し、
.then(snapshot => {
//docsプロパティ(※)を指定しforEachで各データを取り出します。
snapshot.docs.forEach(doc => {
const data = doc.data()
//準備しておいた配列に取り出したデータをpushします
posts.push({
authorName: data.authorName,
content: data.content,
createdAt: data.createdAt,
title: data.title,
id: doc.id
})
})
//ここはhooksなので気にしなくてOK
setCurrentPost(posts)
})
}
※マークをつけたdocsプロパティは、get()メソッドの返り値QuerySnapshotが持つ、プロパティで指定したcollectionのデータを配列として持っています。複雑ですね...w
この辺の返り値や持っているプロパティなどに関しては英語しかありませんがfirebaseの公式リファレンスに細かく説明が載っています。
番外編:documentのidを自動的に付与する方法について
ここも少し迷ったところなので、一応紹介します。
今度は逆にデータを保存する方法についてなのですが、firestoreでは自動idが推奨されていますが、この自動のdocument idをどのようにつけるのかというと、add()
を使います。
db.collection('posts').add({
title: title,
content: content,
authorName: authorName
})
このようにadd
を使えばデータを保存する時に自動idを生成してくれます。
ちなみにデータを追加する時にset()
と言うメソッドも使いますが、これはdocumentのidを指定する必要がありますし、idを自動で生成してくれません。
「じゃあ使わなくていいじゃん」と思うかもしれませんが、これはこれで、データの編集の際に{ merge: true }
と引数に指定することで、値が変わっているところだけ更新するので、無駄な書き込みが無いなどのいいところもあります。
このようにしてデータの追加の際はaddにすれば自動でidが生成されるのです。
firebaseは公式ドキュメントを読めば結構理解できる
firebaseはかなり公式のドキュメントが充実しています。
今回のようなわからないメソッドなどがあった場合はリファレンスを見れば、大切なところが全て書いてありますし、導入部分の簡単な使い方については日本語のドキュメントがあります。
ですので、firebase関連でわからないことがあったら、とりあえず公式ドキュメントをみましょう
と言うお話でした😅