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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Cloud Firestore

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

JavaScript

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

TypeScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

0回答

686閲覧

Firestore上の階層構造をもつデータをonSnapshotを使ってsubscribeしたい

gano

総合スコア39

Cloud Firestore

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

JavaScript

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

TypeScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/02/24 00:54

前提

[前提]
言語 : JavaScript (or TypeScript)
フレームワーク: React
データベース : Firestore

具体的な状況

オンライン講座のシステムを作っています。
「講座」のデータは以下のような階層構造でデータを保持します。

Course > Section > Chapter > lecture

データ構造に関して具体例をあげますと、

  • (Course) JavaScriptコース
  • (Section) 第1部 JavaScriptの基礎
  • (Chapter) 第1章 変数と定数
  • (Lecture) 講座1 変数を宣言する

というようなデータを保持します。

Firestore上では、素直にサブコレクションを用意して、
Courses > Sections > Chapters > Lectures
という構造でデータをもたせています。

実現したいこと

Courses/Sections/Chapters/Lecturesの
すべての階層を一覧で表示したいため、
このデータを階層構造を保持した状態で、
Fetchしたいと考えています。

できればonSnapshotを使って、
リアルタイムリスナーでデータを取得したいと思ってます。

問題

前述の件を実現しようとすると、以下の手順で、データを取ってくる必要があります。

Course情報を取得する (リアルタイムリスナー) ↓ Course情報の取得を待つ ↓ Course情報が保持するSection情報を全件取得する(リアルタイムリスナー) ↓ Section情報の取得を待つ ↓ Section情報をループして、 各Section情報に紐づくChapter情報を全件取得する(リアルタイムリスナー) ↓ 以下Chapter,Lectureと同様のことをします。

これを実現しようとすると、
1. 毎回異なる数のリスナーを発行する必要がある。
2. すべてのリスナーに対してそのデータを格納する変数が必要になるため、その都度useStateを置く必要がある。
(可変な数の useStateを用意する。。)
となります。

うまく問題の具体例が出せず申し訳ないのですが、
複数のリアルタイムリスナーを連鎖させて実行させる場合の設計が作れない
という状況です。

リアルタイムリスナーは諦めた方が良いでしょうか。
アドバイスをいただけますと幸いです。

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

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

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

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

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

hoshi-takanori

2021/02/24 01:32

4 階層すべてを一度に表示するとリスナーの数もすごいことになりますが、表示も大量になって見づらいのでは…。
gano

2021/02/24 03:22

コメントありがとうございます。 表示は、トグルで表示・非表示できるようになっているので、 必要な箇所のみ表示する形になります。 デザイン、UI的には特に問題ないと考えています。
hoshi-takanori

2021/02/24 03:33 編集

なら、トグルで表示にした時だけ subscribe すれば良いのかも。 というか、内容的にそんなに変更されるものでもないような気がするので、リアルタイムである必要もないのでは。
gano

2021/02/24 03:40

ありがとうございます。 おっしゃるとおりで、内容的にリアルタイム性が求められるものではないので、 subscribeをやめる方向で考えています。 今後のために、このようなネスト構造の時にイベントリスナーの連鎖はどうするか という事で質問させていただきました。 Firebase側では今回のケースのような階層構造のデータの取得はあまり想定されておらず、 UIや設計側でソリューションを考えた方が良いと認識しました。 コメントありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問