【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の中身
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?