この記事はQiitaの私の記事からそのままコピってきたものである。
Qiitaを退会するにあたって、消してしまうには惜しかったので以下にそのまま残すことにする。
Markdownの記法が違うことによる表示崩れが起きているが、直すのが面倒なので放置する。
title: Cloud FirestoreのCollectionとDocumentからデータを取得する際の違い tags: Firebase Firestore cloudfunctions author: sosmii slide: false
死ぬほど詰まったのでメモ 気が向いたら清書するかもしれぬ
Cloud FirestoreではRDBのテーブルに該当するものをCollection, レコードに該当するものをDocumentと呼んでいる。 (筆者はRDBしか知らぬため、今後もこの呼び方をすることがある。正確に対応しているわけではないとは知っているが、イメージ的には間違っていないと思われるため、ご容赦頂きたい。)
(JSONが集まってテーブルみたいに機能しているもんだと勝手に解釈している)
前者(テーブル)からデータを抜いてくるときはオブジェクトの配列が、後者(レコード)からデータを抜いてくるときは単数のオブジェクトが返ってくるものだと思いこんでいたが、そもそも返ってくるオブジェクトの型自体が違っていた。
よって、データ取得のために呼ぶメソッドも異なっており、Cloud Functionから呼ぼうとしていたことも相まり無駄に時間を食ってしまった。 (ローカル環境でのテストにもちと時間がかかるのである)
ここに違いを記しておくことにする。
レコード...つまり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に対して操作を行うときは、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()