Cloud Firestoreのデータモデル

Cloud Firestoreのデータモデル

データは「ドキュメント」に格納し、それが「コレクション」にまとめられます。
これは、MongoDBか? daiiz
データを構造化する方法

ドキュメント
ユーザ「alovelace」を表すドキュメント
一連のキーと値のペア (連想配列)
一般的にドキュメントは、軽量のJSONレコードとして扱える
Cloud Firestoreは、小型のドキュメントの大きなコレクションを格納するために最適化されている
「サブコレクション」と、ネストされたオブジェクトを格納できる


コレクション
users コレクションに、ユーザを表すドキュメントを格納する例
単なるドキュメントのコンテナ
コレクション内のドキュメントの名前は一意であるべき
ユーザーID
独自アルゴリズムで与えたキー
Firestoreで add() した際に自動採番されたランダムなID
コレクションの作成、削除は全自動
必要なら生成される
空になったら勝手に消える


リファレンス
すべてのドキュメントは、DB内の場所によって一意に識別される
js
Copied!
const alovelaceDocumentRef = db.collection('users').doc('alovelace')
参照を作成しているだけ
リファレンスを作成してもネットワーク操作は実行されません。
alovelaceDocumentRef には、データ実体は入っていない
ref作成操作においては、データの実体の有無は不可知
もちろん、コレクションへのrefも作れる
この書き方はmongoそのものだな
js
Copied!
const usersCollectionRef = db.collection('users')
/ を使ったref作成
ドキュメントまたはコレクションへのパスを文字列として指定
パス コンポーネントをスラッシュ(/)で区切ってリファレンスを作成する
js
Copied!
const alovelaceDocumentRef = db.doc('users/alovelace')
これは果たして便利なのか?


階層データ
階層構造で表現されるデータを保存していく
メッセージとチャットルームの例
rooms : チャットルームを格納するコレクション
いわゆる、ルートレベルのコレクション?
チャットルーム内でやりとりされている大量のメッセージをどこに保存するか?
各roomドキュメントの直下に直接的に置くのはいやだ
そこで、サブコレクション
サブコレクションは特定のドキュメントに関連付けられたコレクションです。
データは最大100レベルまでネストできる
messages : コレクション rooms に関連付けられたサブコレクション
メッセージへの参照を作成する
サブコレクション内部のドキュメントまで指定するので少々深くなる
js
Copied!
const messageRef = db.collection('rooms').doc('roomA')
.collection('messages').doc('message1')
// `/`を使ってこうも書ける?
// 説明はされていなかったが、連想ゲーム的に解くとたぶんこうなる
const messageRef = db.doc('rooms/roomA/messages/message1')
roomA内の全てのmessageにアクセスするには?
階層構造で保存しているので簡単。findAllとか要らない。
js
Copied!
const messages = db.collection('rooms').doc('roomA').collection('messages')

2018/2/20
Powered by Helpfeel