22
17

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.

Firestoreでidのわからないdocumentを取得したいときはどうすればいいのか

Posted at

firestoreはフロントエンドエンジニアが個人でwebサービスを作る際に、わざわざデータベースを一から作っていく必要がなく、数行のコードでデータを保存したり、取得したりととても便利なサービスです。

ただ、使いはじめの頃、必ずと言っていいほどidのわからない(または自動で付与されたidの)documentをどうやって取得するのかという壁が立ちはだかります。

公式ドキュメントではfirebase.firestore.collection("cities").doc("SF").get()で取得できると書いてあるけど、この例でのSFと言うidがそれ以外、もしくは複数のドキュメントをgetしたい場合にはどうすればいいのかと言う話です。

結論:docを使わなくてもdocumentの取得は可能

公式リファレンスをみていただければわかると思いますが、データの取得に使うget()メソッドは返り値としてQuerySnapshotを返します。

このQuerySnapshotdocumentのidを持っていますし、このsnapshotからdocumentを取り出すことが可能です。

documentの取り出し方の一例を紹介

ここでは僕のパターン(React)を紹介します。

Example.jsx
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()を使います。

Form.jsx
    db.collection('posts').add({
      title: title,
      content: content,
      authorName: authorName
    })

このようにaddを使えばデータを保存する時に自動idを生成してくれます。

ちなみにデータを追加する時にset()と言うメソッドも使いますが、これはdocumentのidを指定する必要がありますし、idを自動で生成してくれません。

「じゃあ使わなくていいじゃん」と思うかもしれませんが、これはこれで、データの編集の際に{ merge: true }と引数に指定することで、値が変わっているところだけ更新するので、無駄な書き込みが無いなどのいいところもあります。

このようにしてデータの追加の際はaddにすれば自動でidが生成されるのです。

firebaseは公式ドキュメントを読めば結構理解できる

firebaseはかなり公式のドキュメントが充実しています。

今回のようなわからないメソッドなどがあった場合はリファレンスを見れば、大切なところが全て書いてありますし、導入部分の簡単な使い方については日本語のドキュメントがあります。

ですので、firebase関連でわからないことがあったら、とりあえず公式ドキュメントをみましょうと言うお話でした😅

参考

Firebase公式ドキュメント

22
17
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
22
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?