firebaseを利用して、投稿のいいね数を、年別、月別、日別に例えばランキングなどのために集計したいと考えています
普通に考えれば、投稿のサブコレクションにいいねに作成時間を加えたものを記録していき、where句の指定の期間の範囲で絞り込めば、ある投稿に対する特定の期間のいいねを抽出できると思います。
TypeScript
1/posts/:id/likes/:userid 2 3interface Like { 4 userId: string; 5 createdAt: db.timestamp; 6}
TypeScript
1db.collections("posts").doc(id).collections("likes") 2 .where(createdAt, ">=", starttime) 3 .where(createdAt, "<=", endtime) 4 .get()
しかし、たとえば今月や先週の言い値の数などでorderbyしてランキングを実装しようと思うと一度すべての投稿の特定期間のいいねを取得して、それをクライアントサイドでソートするという作業が必要になります。
そこで、likeStatistics というルートコレクションを作成し
//2020年1月1日のデータ階層 likeStatistics └─years └─2020 ├─months │ └─1 │ ├─posts │ │ └─postid │ └─weeks │ └─1 │ ├─days │ │ └─1 │ │ └─posts │ │ └─postid │ └─posts │ └─postid └─posts └─postid
ある日時にいいねされた場合に
TypeScrpt
1 2//likeStatistics/../posts/:postid 3interface PostState{ 4 post: db.DocumentReference; 5 likeCount: number; 6} 7 8 9const today = new Date() 10const year: string = 年 11const month: string = 月 12const week: string = 第何週 13const date: string = 日 14 15const postRef = db.collection("posts").doc(postId) 16 17//年別のいいねを加算 18db.collections("likeStatistics") 19 .doc(year) 20 .collection("posts") 21 .doc(postid) 22 .update({likeCount: db.FieltValue.increment(1)}) 23 24//月別のいいねを加算 25db.collections("likeStatistics") 26 .doc(year) 27 .collection("months") 28 .doc(month) 29 .collection("post") 30 .doc(postid) 31 .update({likeCount: db.FieltValue.increment(1)}) 32 33//週別のいいねを加算 34db.collections("likeStatistics") 35.doc(year) 36.collection("months") 37.doc(month) 38.collection("weeks") 39.doc(week) 40.collection("post") 41.doc(postid) 42.update({likeCount: db.FieltValue.increment(1)}) 43 44//日別のいいねを加算 45db.collections("likeStatistics") 46.doc(year) 47.collection("months") 48.doc(month) 49.collection("weeks") 50.doc(week) 51.collection("dates") 52.doc(date) 53.collection("post") 54.doc(postid) 55.update({likeCount: db.FieltValue.increment(1)})
というように、year, month, week, dayドキュメントのすべてのposts/:postidのlikeCountを加算すれば、
例えば2020年1月のいいね数TOP10は
TypeScript
1db.collections("likeStatistics") 2 .doc(2020) 3 .collection("months") 4 .doc(1) 5 .collection("posts") 6 .orderby("likeCount", "desc") 7 .limit(10) 8 .get() 9
で10個のリファレンスを取得して、それらをルートのpostsから本データを抽出するのが簡単にできると思いました
この設計は妥当でしょうか?
それとも前者の設計でCloud FunctionsでAPIを作ったほうがよいでしょうか?
ご意見やご指導願います。
あなたの回答
tips
プレビュー