FirestoreとFilestoreはぱっと見違いが分からないですが、Firestoreでアプリケーションを作っていてデータが増えてくるとドキュメントとコレクションのパスの管理に困ります。
yagish履歴書では、ユーザーごとに/userdir/{ユーザーID}/というドキュメントを作り、それ以下にサブコレクションやドキュメントを追加していくという形で管理してます。
シンプルですが、それでもこのユーザーのバックアップがあるコレクションのパスが欲しい、となったときに毎回 /userdir/{uid}/backupsをコーディングすることはしたくありません。
なので一か所で管理し、foobar.backups(uid) みたいな感じでパスが返ってくると、使いやすいし、変更の際も1か所変えれば済むので便利です。
いろいろ試行錯誤したけど、現状はこんな感じで関数を作って対応してます。
const createFirestorePaths = function (uid, docId) { if (!uid) { console.error('uid not set') return {} } let paths = { userdir: `userdir`, userDoc: `userdir/${uid}`, backups: `userdir/${uid}/backups`, configs: `userdir/${uid}/configs`, omikujis: `userdir/${uid}/omikujis`, postcards: `userdir/${uid}/postcards`, statistics: `userdir/${uid}/statistics`, statisticsOmikuji: `userdir/${uid}/statistics/omikuji` } if (docId) { const docPaths = { omikujiDoc: `userdir/${uid}/omikujis/${docId}` } paths = Object.assign(paths, docPaths) } return paths }
これで、
console.log(createFirestorePaths('123')) {userdata: "userdata", userDoc: "userdata/123", backups: "userdata/123/backups", configs: "userdata/123/configs", omikujis: "userdata/123/omikujis", …} backups: "userdata/123/backups" configs: "userdata/123/configs" omikujis: "userdata/123/omikujis" postcards: "userdata/123/postcards" statistics: "userdata/123/statistics" statisticsOmikuji: "userdata/123/statistics/omikuji" userDoc: "userdata/123" userdata: "userdata"
とりあえずこんな感じでObjectで返ってくるので使ってます。
Functionsでイベントを取りたいときは{uId}のような文字列を渡してしまえば同じように使えます。
exports.updateOmikujiStatistics = functions .runWith(runtimeOptions) .firestore .document(createFirestorePaths('{uId}', '{omikujiId}').omikujiDoc) .onCreate( async (snap, context) => { const uId = context.params.uId const omikujiData = snap.data().content
4階層目のドキュメントをID指定で取得したいとき(omikujiDocのところ)は苦肉感あふれてるがパスの生成を一か所でやることを優先すると他の方法が思いつかなかった。
関数と一覧のObjectを分けて管理したくなるけど、置換にテンプレート文字列を使って楽なので外に出せない。
みんなどうしているんだろう。
- 作者: 小笠原みつき,西村公宏,柳佳音,志甫侑紀,池田友洋,木村涼平,?橋優介,大塚雅和,飯塚直,吉川竜太,末永恭正,久保田祐史,浜田真成,穴井宏幸,大島一将,桑原仁雄,牧大輔,池田拓司,はまちや2,竹原,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2018/06/23
- メディア: 単行本
- この商品を含むブログを見る