見出し画像

【Firebase×Swift】DocumentSnapshot,QuerySnapshot,QueryDocumentSnapshotの違いとは?

こんにちはシオンです。

今回はFirebaseを使っていると必ず目にするこの三つについてまとめていきます。

結論としては、それぞれが持っているデータが異なります。


■まずSnapshotとはなに?

3つともに共通しているのが最後にSnapshotとついていること
僕はあまり馴染みのない言葉でした。Snapshotとはなんなのか?

Snapshotとは
「ある時点における参照先のデータの全体像」
になります。ちょっと言い回しがわかりにくいですが要は

「自分が今取ってきたデータ」

ということです。
つまりこの3つは、取得してきたデータをそれぞれ持っています。

なのでこの三つの違うところは持っているデータの中身になります。


■DocumentSnapshotとは?

これは単体のドキュメントデータを持っています。
具体的にはこうなっています。

ドキュメント ┳ フィールド1
         ┣ フィールド2
         ┗ フィールド3

データベースの中にコレクションがあり
その中にそれぞれ違う名前(ドキュメントID)のドキュメントが入っていると思うんですが、その一つ一つのことですね。

DocumentSnapshotが出てくるのは単体のドキュメントを取得した時です。
具体的にはgetDocument()でドキュメントを取得した時です。

//取り出したいドキュメントデータの場所を指定
let Ref = Firestore.firestore().collection("コレクション名").document("取り出したいドキュメント名")

//getDocumentで取り出す
Ref.getDocument() { (data , error) in 
    if let error = error {
        //エラーがあればデバックしてリターン
        print(error)
        return
    }
    //この時dataというのが、DocumentSnapshot型のドキュメントデータ
    //もしこのdataの中のtestStringというフィールドを取り出すときは以下
    let str = data.get("testString")
    
}

このようにドキュメント一つを取得してきた時はDocumentSnapshotがデータを持っています。


■QuerySnapshotとは?

これは複数のドキュメントデータを持っています。
以下のイメージです。

QuerySnapshot  ┳ ドキュメント1
               ┣ ドキュメント2
               ┗ ドキュメント3

このように複数のドキュメントが入っています。
なのでデータベースから複数のドキュメントを取得した時はquerySnapshotがこの形でデータを持っています。具体的にはgetDocumentsをした時などです。

//取り出したいドキュメントデータの場所を指定
let Ref = Firestore.firestore().collection("コレクション名")

//getDocumentsで取り出す
Ref.getDocuments() { (querySnapshot , error) in 
    if let error = error {
        //エラーがあればデバックしてリターン
        print(error)
        return
    }
    //この時querySnapshotには指定したコレクションのドキュメントデータが全て入っている。
    
}

このようにgetDocumentsで取ってきたデータを持っているのがQuerySnapshotになります。


■QueryDocumentSnapshotとは?

これは上のQuerySnapshotが持っているデータの中身一つ一つを持っています。ほとんど最初のDocumentSnapshotと同じです。単体のドキュメントを持っています。違うのはQuerySnapshotの中に入っているということ。なのでイメージとしては

QuerySnapshot  ┳ ドキュメント1    
               ┣ ドキュメント2
               ┗ ドキュメント3

このドキュメント1〜3がQueryDocumentSnapshot

となります。
なので出てくる場面としてはgetDocumentsで取得してきたデータの中身一つ一つに何か処理をする時です。

//さっきのQuerySnapshotと同じです。
//取り出したいドキュメントデータの場所を指定
let Ref = Firestore.firestore().collection("コレクション名")

//getDocumentsで取り出す
Ref.getDocuments() { (querySnapshot , error) in 
    if let error = error {
        //エラーがあればデバックしてリターン
        print(error)
        return
    }
    //この時querySnapshotには指定したコレクションのドキュメントデータが全て入っている。
    //例えば先頭のデータのフィールドを取得したい時
    querySnapshot.documents[0].get("フィールド名")
}

このように使い方はDocumentSnapshotとほぼ同じです。

getDocumentsで取得してきたデータを任意の形に変換したい。
TableViewに表示したいという場合はこちらを参考にしてみてください!


■まとめ

違う点はどんなデータを持っているか
DocumentSnapshot : 単体のドキュメントデータ
QuerySnapshot : 複数のドキュメントデータ
QueryDocumentSnapshot : 単体のドキュメントデータ、QuerySnapshotの中身



この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?