Cloud Functions for FirebaseからFirestore を齧ってみた

<h1>初めに

あまりに久しぶりなので、アカウントがどこいったか状態でした
Unityでライトゲームを作ってたらデータを保存やらなんやらが必要になったのでFirebaseをいじった
最初はUnityからFireStoreを操作してたんだけど、サーバ側処理がどうしても必要だったのでfunctionsでやったのだけど
Firestoreは自分が知ってるRDBMSの世界とちょっと違ったので整理してみた

<h2>環境

Mac上にVSCode入れてFirebaseEmulatorを入れ、Firestoreとfunctionsで色々実装している
NodeJSの上のJavascript
多分、どの開発環境でもクラスの構成やらメソッドは同じ。
（ただし、環境によってはメソッドが実装されていないものがある模様。Unity版とか特に・・・）

<h4>大体の掴み

Database⇨Collection⇨Document⇨Dataという階層構造の模様
実装自身は○○Referenceというものと、◯◯Snapshotというのでできている

<h3>大事なこと

本来はこちらを参照するべき
https://firebase.google.com/docs/reference

<h4>助けになりそうなクラス達

自分でごっちゃになったのでまとめてみた
実装例は気が向いたら別文章にする、、、かな？
※メソッドは全部網羅はしておりません

Firestore
ここで使うのは、collectionとバッチ、トランザクションくらいか。
|Return | Property  | 説明 |
|---|---|---|
|App|app|サーバインスタンス|

|Return | Method | arg | 説明 |
|---|---|---|---|
|WriteBatch|batch||				バッチの準備|
|CollectionReference|collection|path|		コレクションリファレンスを返す		|
|Query			|collectionGroup|id 	|コレクションIDが含まれるコレクショングループを作るqueryを返す|
|DocumentReference	|	doc|pathToDoc|		パスに示されたドキュメントリファレンスを返す					|
|Promise		|	runTransaction	||	トランザクションの準備|

CollectionReference
Queryとして使うことの方が多いかもしれない
Queryの派生クラスなのでQueryも同じメソッド、プロパティがある
|Return | Property  | 説明 |
|---|---|---|
|string|id|コレクションのID|

|Return | Method | arg | 説明 |
|---|---|---|---|
|DocumentReference|	add|DataObject| 	ドキュメントの追加、IDは自動生成|
|DocumentReference| doc|path| 		ドキュメントリファレンスの取得 |
|Query |			endAt|docShot| 	そのドキュメントが最後になるQueryを返す|
|Query |			endAt|FieldValue| 指定されたフィールドが最後になるqueryを返す|
|Query |			endBefore |endAtと同じ|endAtの一つ前|
|Query |			startAt　|endAtと同じ|endAtのStart版|
|Query |			startAfter|endAtと同じ|StartAtの一つ後ろ|
|Query |			where|fieldName,,option,value| where節。条件フィールド、条件、条件データ |
|Query |			orderby |fieldName,option|ordeeby節。ソートフィールド、オプション（asc,desc） |
|Query |			limit 	| number|		取得数を制限する|
|Query | 			limitToLast |number|		最後に一致した結果を指定数返すクエリーを返す|
|Promise QuerySnapshot	|	get|| 				多分、Collectionでは使わぬ（全件取得）|


DocumentReference
|Return | Property  | 説明 |
|---|---|---|
|string|id	|	DocumentのID|
|string|path|	Documentへのpath|

|Return | Method | arg | 説明 |
|---|---|---|---|
|CollectionReference|collection| path |	サブコレクションの取得など		|
|Promise			|update	|Object|		ドキュメントを更新（ドキュメントがなければ失敗）　|
|Promise			|set　　　|Object|　		ドキュメントを更新（なければ追加）|
|Promise			|delete||			ドキュメントを削除|
|Promise DocumentSnapshot|		get	||			ドキュメントの実態を取得|

QuerySnapshot
Query実行⇨結果をForEachで回しながら何かをする、とか。
|Return | Property  | 説明 |
|---|---|---|
|Array|	docs|			QueryDocumentSnapshotの配列を返す|
|number	|		size	|			docsのサイズ|
|boolean|			empty|			空かどうか|
|Query |			query|			このSnapshotを作成したQueryを返す|

|Return | Method | arg | 説明 |
|---|---|---|---|
|Array|	docChanges|		|Snapshotを取得してから変更されたDocumentChangeの配列を返す|
||forEach||	説明不要？ |

DocumentSnapshot/QueryDocumentSnapshot
基本的には同じ。
QueryDocumentSnapshotはQuerySnapshotのForEachで使うのでExistsは常にTrueでUndefinedはない
|Return | Property  | 説明 |
|---|---|---|
|boolean|	exists|			そのドキュメントがあるか|
|string|id|		ドキュメントのID|
|DocumentReference|		ref	|			そのドキュメントのReference|

|Return | Method | arg | 説明 |
|---|---|---|---|
|Object|data||			ドキュメントデータが入ったオブジェクト。ドキュメントがないとundefined|
|Any|get|fieldName|	フィールドデータ				|
|boolean|	isEqual	|DocumentSnapshot	|引数と同じかどうか|

FieldValue
更新時にフィールドデータに特定の値を入れたい時に使う。すべてStaticメソッド
|Return | Method | arg | 説明 |
|---|---|---|---|
|FieldValue	|	arrayRemove	|array|		更新時に配列フィールドから削除する要素を準備する |
|FieldValue	|	arrayUnion |array|			更新時に配列フィールドに追加する要素を準備する |
|FieldValue	|	delete	||			更新時にそのフィールドを削除するようマークする |
|FieldValue	|	increment |num|		更新時に数字をインクリメントする|
|FieldValue |	serverTimestamp||		更新時にサーバ側のタイムスタンプを使う|

TransactionとWriteBatch
トランザクションは読み込みが先でないと失敗する
データを取得し、それに加工して更新する時など。
|Return | Method | arg | 説明 |
|---|---|---|---|
|Transaction	|	delete|Documentreference|			ドキュメントを削除する			
|Promise DocumentSnapshot	|	get|DocumentReference|			ドキュメントを取得する
|	Transaction	|	set|DocumentReerence,Object		|ドキュメントの更新(ドキュメントがない場合追加）
|	Transaction	|	update|DocumentReference,Object	|ドキュメントの更新（ドキュメントがないと失敗）、ネストのデータも更新可能

WriteBatch
複数の更新を一気にやりたいとき
commit以外はTransactionと同じメソッド。戻りがWriteBatchになる
|Return | Method | arg | 説明 |
|---|---|---|---|
|WriteBatch	|	delete|Documentreference|			ドキュメントを削除する			
|Promise DocumentSnapshot	|	get|DocumentReference|			ドキュメントを取得する
|	WriteBatch	|	set|DocumentReerence,Object		|ドキュメントの更新(ドキュメントがない場合追加）
|	WriteBatch	|	update|DocumentReference,Object	|ドキュメントの更新（ドキュメントがないと失敗）、ネストのデータも更新可能
|Promise	|		commit	||			バッチ処理の実行|

<h3>続く

かな？