きっと何者にもなれないSEの記録帳

日々で得たIT技術を記録していきます。

AngularFireでRealtime DatabaseからCloud Firestoreに変更した

AngularFIreを使用してアプリを作っていたのですが、最近のAngularFireのアップデートでRealtime DatabaseからCloud Firestore推しな雰囲気を感じたので、Cloud Firestoreに変更してみました。
AngularFireを使用する上でのRealtime DatabaseとFirestoreとの違いについて書きます。

データ構造

Choose a Database: Cloud Firestore or Realtime Database  |  Firebase

Cloud Firestore Data Model  |  Firebase

Firebaseのページに比較とFirestoreのデータモデルについての情報があります。
開発の際の注意点としては、データ構造を変更しないといけない可能性があります。
Realtime DatabaseではJSONに乗っ取っていれば、データを保存できました。
Firestoreになるとコレクション、ドキュメントという構造に合わせてデータを保存する必要があります。

例えば、以下のような例です。

FireStore

db.collection('objects').doc('object').set(data);

コレクション、ドキュメントという構造に準拠しないといけないです。

Realtime Database

db.object('object').update(data);

Realtime Databaseだと、JSONであればそのまま保存可能でした。

クエリ

angularfire2/querying-collections.md at master · angular/angularfire2 · GitHub

FIrestoreでは、クエリ表現が変わっています。
ページングのためにorderByを使用していたのですが、影響がありました。
Realtime DatabaseではorderByKeyというメソッドでkey順で並べ替えることができました。
Firestoreだと、それに相当するメソッドはなく、orderByというメソッドに並べ替えの機能は集約されています。
orderByメソッドでkey順(Firestoreだとid順)に並べるには特殊な指定が必要でした。

以下の通りです。

Firestoreでkey順に並べ替えるやり方

import { firestore } from 'firebase';
// 中略
db.collection('items', ref => ref.orderBy(firestore.FieldPath.documentId()));

firebaseのnpmモジュールにあるFieldPathクラスを利用をする必要があります。

ただし、keyの命名方法が変わっているので、どのように並び替えたいかによってはそもそもやり方を変える必要がありそうです。
Realtime Databaseの場合、データの作成順に順番に命名されるような形でした。
なので、key順で並べ替えれば、結果として、データを作成した順番に並べ替えができました。
Firestoreの場合、keyの命名は順番に関係なくランダムなようなので、データを作成した順番に並べ替えが必要であれば、データ内に作成日時を付与して、そのフィールドで並べ替えるといった工夫が必要と思われます。

まとめ

上記につまづいたくらいで、そのほかはメソッド名を変更するくらいで比較的簡単にRealtime DatabaseからCloud Firestoreに変更できました。
Firebaseのドキュメントを見てみると、今後はCloud Firestoreがスタンダードになりそうな雰囲気なので、今後はこちらを使っていくようにしたいと思います。