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

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

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

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

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Cloud Firestore

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

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

解決済

Firestoreでの深い位置にある情報の取得方法

KeiHarry
KeiHarry

総合スコア10

Firebase

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

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Cloud Firestore

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

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

1回答

0リアクション

0クリップ

128閲覧

投稿2022/08/13 08:49

前提

Firestoreの深い位置にある情報を取得したいです。というのも、

コレクションA-----ドキュメントB0---------コレクションC0----ドキュメントD0 |-フィールドb0 | | |-フィールドd0 |-フィールドb1 | | |-フィールドd1 |-フィールドb2 | | | |-ドキュメントD1 | |-コレクションC1---ドキュメントE0 | |-フィールドe0 | |-フィールドe1 | |-ドキュメントE1

という構造でデータを格納していて、

dart

Expanded( child: StreamBuilder<QuerySnapshot>( // 投稿メッセージ一覧を取得(非同期処理) // 投稿日時でソート stream: FirebaseFirestore.instance .collection('books') .doc(widget.bookInfo.id) .collection(widget.bookInfo['name']) .orderBy('date') .snapshots(), builder: (context, snapshot) { // データが取得できた場合 if (snapshot.hasData) { final List<DocumentSnapshot> documents = snapshot.data!.docs; : :

上のstreamの記述はこれで正しく、データの構造におけるドキュメントDの層をフィールドのdate順に表示することを示せているのですが、最後のdocuments=の部分で、この状態ではドキュメントBの層について格納していることになります。

dart

print(documents[0]['name']);

とすると、ドキュメントBの中のフィールドb層のnameの中身が出力される状態です。

実現したいこと

・ドキュメントD層の中のフィールドd層の中身を出力したいです。
つまり、

dart

print(documents[index]['name']);

でドキュメントD層をindexで指定し、それが持つフィールドdの内、nameの中身を出力できるように、1番最後の

dart

final List<DocumentSnapshot> documents = snapshot.???????;

を書き換えたいです。

発生している問題・エラーメッセージ

設計段階のためエラーは出ていません。

該当のソースコード

試したこと

dart

final List<DocumentSnapshot> documents = snapshot.data!.docs;

のsnapshotより後ろのdata!以下をいじったり、snapshotとdata!の間に文字を挟もうとしましたがダメでした。

補足情報(FW/ツールのバージョンなど)

pubspec.yaml

name: XXXX description: A new Flutter project. publish_to: 'none' environment: sdk: ">=2.17.6 <3.0.0" dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.2 firebase_core: ^1.17.1 firebase_crashlytics: ^2.8.1 firebase_analytics: ^9.1.8 flutter_inappwebview: ^5.3.2 firebase_auth: ^3.3.8 cloud_firestore: ^3.4.3 provider: ^5.0.0 flutter_riverpod: ^1.0.4 get: ^4.6.5 hive: ^2.2.3 hive_flutter: ^1.1.0 hive_generator: ^1.1.3 build_runner: ^2.2.0 flutter_slidable: ^2.0.0 sqflite: ^2.0.3 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 flutter: uses-material-design: true

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

TakaseHiromichi

2022/08/14 01:01

documents 自体にはどのような値が入っているのでしょうか?
KeiHarry

2022/08/14 13:08

ありがとうございます。 https://www.flutter-study.dev/firebase-app/firestore こちらの教材を写経してそれを改造する形で製作しているため、"snapshot."がどういうものか分かっていないのですが、1番上の図で言うところのコレクションAとドキュメントBの間で切ってそれ以下の情報を ```dart final List<DocumentSnapshot> documents = snapshot.data!.docs; ``` で入れて、 ```dart print(documents[0]['name']); ``` のように出力します。
TakaseHiromichi

2022/08/15 00:51

はい、documents 自体をprintするとどのような値が表示されるのかが気になります。
TakaseHiromichi

2022/08/15 00:53

documentsでDを引っ張ってこれているのですよね?
TakaseHiromichi

2022/08/15 00:54

> ドキュメントDの層をフィールドのdate順に表示することを示せている というのは、どちらから判断されましたか?実際にデータを表示できていることを確認しましたか?
KeiHarry

2022/08/15 07:58

ありがとうございます。 documentsをprintすると >[Instance of '_JsonQueryDocumentSnapshot', Instance of '_JsonQueryDocumentSnapshot'] と出力されました。 documentsではDは引っ張ってこれておらず、 >documents[0]['name'] でB層の0番目のドキュメント(つまりB0)の中のnameというフィールドの中身を得られます。 >stream: FirebaseFirestore.instance .collection('books')//A層 .doc(widget.bookInfo.id)//B層 .collection(widget.bookInfo['name'])//C層 .orderBy('date') .snapshots(), でドキュメントD層をフィールドのdate順に並べていると判断したのは、ここでいう3,4行目は独自に追加したもので、参考にした教材通りに >>stream: FirebaseFirestore.instance .collection('books')//A層 .orderBy('date') .snapshots(), とすると、ドキュメントB層をフィールドのdate順に並べられたからです。booksというのはコレクションAの名前です。ここにエラーが出ていないことから、並べられていると判断しました。 firestoreの中身についての処理は >stream: FirebaseFirestore.instance .collection('books')//A層 .doc(widget.bookInfo.id)//B層 .collection(widget.bookInfo['name'])//C層 .orderBy('date') .snapshots(), builder: (context, snapshot) { // データが取得できた場合 if (snapshot.hasData) { final List<DocumentSnapshot> documents = snapshot.data!.docs; この部分だけであると考えられ、streamで指定した層に応じてbuilderのsnapshot.data!.docsが変わるのだと思いましたが、documentsに入っていたのはB層以下の情報でした。 .......とここまで打ってもう一度確認したところ自分のミスに気づきました。すみません、自己解決できました。ありがとうございます。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Firebase

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

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Cloud Firestore

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

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。