Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save sosmii/8e426cf0986a8a914dd61766b73cf5d8 to your computer and use it in GitHub Desktop.
Save sosmii/8e426cf0986a8a914dd61766b73cf5d8 to your computer and use it in GitHub Desktop.

Cloud FirestoreのCollectionとDocumentからデータを取得する際の違い

注記

この記事はQiitaの私の記事からそのままコピってきたものである。
Qiitaを退会するにあたって、消してしまうには惜しかったので以下にそのまま残すことにする。
Markdownの記法が違うことによる表示崩れが起きているが、直すのが面倒なので放置する。


title: Cloud FirestoreのCollectionとDocumentからデータを取得する際の違い tags: Firebase Firestore cloudfunctions author: sosmii slide: false

死ぬほど詰まったのでメモ 気が向いたら清書するかもしれぬ

CollectionとDocument

Cloud FirestoreではRDBのテーブルに該当するものをCollection, レコードに該当するものをDocumentと呼んでいる。 (筆者はRDBしか知らぬため、今後もこの呼び方をすることがある。正確に対応しているわけではないとは知っているが、イメージ的には間違っていないと思われるため、ご容赦頂きたい。)

Collectionイメージ (JSONが集まってテーブルみたいに機能しているもんだと勝手に解釈している)

前者(テーブル)からデータを抜いてくるときはオブジェクトの配列が、後者(レコード)からデータを抜いてくるときは単数のオブジェクトが返ってくるものだと思いこんでいたが、そもそも返ってくるオブジェクトの型自体が違っていた。

よって、データ取得のために呼ぶメソッドも異なっており、Cloud Functionから呼ぼうとしていたことも相まり無駄に時間を食ってしまった。 (ローカル環境でのテストにもちと時間がかかるのである)

ここに違いを記しておくことにする。

Document.get()した時に返ってくるオブジェクトはDocumentSnapshot

レコード...つまりDocumentに対して操作を行うときは、DocumentReferenceオブジェクトのメソッドを使用する。 このとき返ってくるのはDocumentSnapshotである。 https://firebase.google.com/docs/reference/js/firebase.firestore.DocumentSnapshot

const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)

const documentSnapshot = await admin.firestore().collection('sample-collection').doc('uid-of-record').get()
const record = documentSnapshot.data()

console.log(record)

Collection.get()した時に返ってくるオブジェクトはQuerySnapshot

テーブル...つまりCollectionに対して操作を行うときは、CollectionReferenceオブジェクトのメソッドを使用する。 このとき返ってくるのはDocumentSnapshortの配列ではなく、QuerySnapshotである。 https://firebase.google.com/docs/reference/js/firebase.firestore.QuerySnapshot

const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)

const querySnapshot = await admin.firestore().collection('sample-collection').get()
const records = querySnapshot.docs.map(elem => elem.data())

console.log(records)

QuerySnapshotのdocsプロパティの中に、DocumentSnapshotの配列が格納されている。

QuerySnapshotは配列ではないため、下記のように書いても動作しない。

const record = querySnapshot[0].data()

書くならこうである。

const record = querySnapshot.docs[0].data()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment