はじめに
今回の記事は、主にAngularFireの機能に焦点を当てています。AngularとFirebaseについては、すでに扱える状態になっていることが前提となっています。AngularとFirebaseでの開発環境の構築方法については、当ブログの記事を参考にしてもらえればと思います。
それから、データベースとしてFirebaseで用意されているCloud Firestoreを使用します。Firestoreは、「クエリと自動スケーリング機能を備えた次世代のRealtime Datebase」と紹介されていて、MongoDBと同じようにドキュメント指向のいわゆるNoSQLのデータベースです。
この後の説明では、ドキュメント単位、コレクション単位といった言葉を使っています。いわゆるリレーショナルデータベースで言うと、ドキュメントはデータ、コレクションはテーブルになります。
AngularFireを使う準備
AngularFireは、Angular公式のFirebase用ライブラリです。AngularFireには、AngularからFirebaseを操作するための様々なAPIが用意されています。CRUDの処理もAngularFireを使うことで、比較的に容易に書くことができます。まずはこのAngularFireをAngularのプロジェクトで使えるようにする方法から説明していきます。
AngularFireのインストール
Angularのプロジェクトディレクトリ内で以下のコマンドを実行します。FirebaseとAngularFireがインストールされます。
モジュールの読み込み
インストールしたAngularFireから以下のモジュールをコンポーネントに読み込みます。これらの詳細は後ほど説明します。
設定ファイルを用意する
AngularでFirebaseを使用するために、/src/environments/environment.ts
ファイル(環境ごとに使い分けたい情報を登録するためのファイル)を開いて、Firebaseの設定情報を環境変数として登録します。
NgModuleに登録する
コンポーネントに読み込んだモジュールや設定ファイルをコンポーネントを宣言しているNgModuleファイルに登録します。
詳細については、AngularFireのドキュメントや当ブログの関連記事をご確認ください。
以上で、AngularFireを使うことができるようになりました。
Firestoreのデータを扱えるようにする
インターフェースとデータを用意する
まずはデータを準備していきます。たとえば以下のようにデータのインターフェースを定義します。
Firestore上でも同様に上記のように定義して、いくつかデータをコンソールを使って登録しておきます。データが登録してあれば、後々データの取得が試しやすくなります。今回の説明では、コレクションIDをitems
としています(データを取得するときに必要になります)。
AngularFirestoreをDIする
AngularFireでFirestoreを扱うためのサービスとしてAngularFirestore
が用意されています。このAngularFirestoreをコンポーネントで使えるようにDI(依存性注入)します。
Firestoreからデータを取得する
AngularFirestoreを使うと、データをドキュメント単位、コレクション単位で扱えるようになります。AngularFireでは、それぞれ以下のように型が用意されています。
上記の型を使って、Firestoreから取得したドキュメント、コレクションを格納するプロパティ(オブジェクト)をそれぞれ定義します。Firestore上のドキュメント、コレクションはAngularFirestoreで用意されているdoc()
メソッド、collection()
メソッドを使って取得します(それぞれ引数には取得したいドキュメントID、コレクションIDをpathで指定します)。
データを参照する(Read)
データを参照するには、ドキュメント、コレクションをそれぞれ格納したitemDocument
オブジェクト、itemsCollection
オブジェクトのvalueChanges()
メソッドを呼び出します。データがobservable型に変換され、ストリームとして扱えるようになります。
valueChanges()
メソッドは、以下のようにconstructor
やngOnInit
内でを呼び出しておくようにしておくと、コンポーネントの初期マウント時からデータの参照が行えるようになって便利です。
テンプレートに反映させる
参照に関しては、実際にテンプレートを通してデータを表示するところまでが一連の処理となります。データはストリームになっているので、テンプレート側ではasync pipe
を使って、データを参照すると良いでしょう(もちろんviewModel側でサブスクライブしても良いです)。
ドキュメント単位でデータを取得した場合
コレクション単位でデータを取得した場合
参照に関しては、コンポーネント生成時にvalueChanges()
メソッドを呼び出してデータをストリーム化し、テンプレート側ではasync pipe
を使ってデータの状態を監視して表示するようにしておけば、とりあえず後は何もする必要がありません。
今回は、データの参照するのにvalueChanges()
メソッドを使用しましたが、snapshotChanges()
メソッドといったものもあります。こちらは、ドキュメントIDなどのメターデータが含まれた状態でデータを取得したい場合に使用します。
データを生成する(Create)
ここからはメソッドを作る形でサクッと説明していきます。
ドキュメント単位でデータを生成する場合
作成したいデータを引数に指定して、add()
メソッドを呼び出すことで、Firestoreにデータを新たに生成することができます。生成したいデータは、作成したメソッドの引数を通して受け取るようにすると良いでしょう。
コレクション単位でデータを生成する場合
同様に、作成したいデータを引数に指定して、add()
メソッドを呼び出すことで、Firestoreにデータを新たに生成することができます。
なお、参照時にvalueChanges()
メソッドを使用していると、ドキュメントIDが取得できないので、ドキュメントIDをデータとして持っておきたいところです。その場合は、以下のようにdoc()
メソッドで任意のIDを指定してデータを生成することができます。AngularFirestoreで用意されてるcreateId()
メソッドを使用すると、自動でIDを割り振ってくれます。
データを更新する(Update)
ドキュメント単位でデータを更新する場合
更新したいデータを引数に指定して、update()
メソッドを呼び出すことで、データを更新することができます。
コレクション単位でデータを更新する場合
同様に、更新したいデータを引数に指定して、update()
メソッドを呼び出すことで、データを更新することができます。その際に、doc()
メソッドを使って、更新したいドキュメントのドキュメントIDを指定します。
データを削除する(Delete)
ドキュメント単位でデータを削除する場合
delete()
メソッドを呼び出すことで、データを削除することができます。
コレクション単位でデータを削除する場合
同様に、delete()
メソッドを呼び出すことで、データを削除することができます。その際に、doc()
メソッドを使って、更新したいドキュメントのドキュメントIDを指定します。
CRUDを実装したサンプル紹介
上記を踏まえて、 CRUDを実装したサンプルを作成しました。
viewModel(app.component.ts
)のソースコードは以下の通りです。詳細はソースコード内のコメントを見てください。
View(app.component.html
)のソースコードは以下の通りです。
このサンプルのソースコードは、GitHubにもアップしてありますので、こちらも合わせてご確認ください。
ユニットテストコードも書きましたので、参考にしてください。
まとめ
以上、AngularFireを使ったAngular + FirestoreでのCRUD処理の書き方となります。ドキュメント単位、コレクション単位といったようにそれぞれ2通りの処理の書き方を紹介しましたが、基本的にはコレクション単位(AngularFirestoreCollection)で扱うことの方が多いんじゃないかなと思います。今回紹介したサンプルでもコレクション単位でデータを扱っています。
CRUD処理が書けるようになると、開発するアプリケーションの機能の幅も広がります。これだけでもそれなりの機能を持ったアプリを開発することができるようになりますが、AngularFirestoreCollectionでは、さらにwhereやorderbyなどを使ったqueryでのデータ取得にも対応しています。次はこのqueryの使い方を試してみたいと思っているところです。余裕があれば、記事にして紹介できればと思っています。
コメント