Edited at

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

死ぬほど詰まったのでメモ

気が向いたら清書するかもしれぬ


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()