質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

NoSQL

NoSQL(not only SQL)は、リレーショナルデータベース管理システムとは異なるデータベースシステムを指す言葉です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

0回答

750閲覧

firebaseにおける期間別いいね集計機能について

kO2ke

総合スコア1

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

NoSQL

NoSQL(not only SQL)は、リレーショナルデータベース管理システムとは異なるデータベースシステムを指す言葉です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2020/07/02 02:33

編集2020/07/02 02:53

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を作ったほうがよいでしょうか?

ご意見やご指導願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問