私はFirestoreのドキュメントとガイドを調べています。私のコードサンプルは、AngularFire2を使用しています。彼らは、このような構造をお勧めしますが、それらは効率的にすべてのデータを取得話し合うところ、私は表示されませんhttps://firebase.google.com/docs/firestore/manage-data/structure-dataFirestoreのドキュメントにネストされたコレクションからデータを取得する最良の方法は何ですか?
:
はのは、ここに提供した例と同様の「チャット」コレクションを考えてみましょう。 [ここに挿入チャットデータフィールド]
- chatsCollection
- chatDocument
- :
各チャット文書は、プロパティ、メンバーの収集、およびメッセージのコレクションを持っています
- membersCollection
- memberDocument
- [ここで会員データフィールドを挿入]
- memberDocument
- messagesCollection
- messageDocument
- [INSERTメッセージデータフィールドここ]時には大きな可能性が
- messageDocument
- :
Firestoreクエリが浅い
- chatDocument
現時点では、スナップショットを取得してIDを持つオブジェクトにマッピングし、ネストされたコレクションデータを親のドキュメントデータに追加のクエリとマッピングで追加しています。私のアプローチには満足できず、たとえ非正規化されたFirebase構造であっても。
メッセージに戻って追加の例は、単にメンバーにマッピングしている。このコードは、全体他の物語である...
getChatsFromFirestore() {
this.chats = this.dataSvc.getChatsFromFirestore().snapshotChanges()
.map(chatSnaps => {
return chatSnaps.map(chat => {
const chatData = chat.payload.doc.data();
const chatId = chat.payload.doc.id;
return this.dataSvc.getMembersForChat(chatId)
.snapshotChanges()
.map(memberSnaps => {
return memberSnaps.map(member => {
const data = member.payload.doc.data();
const id = member.payload.doc.id;
return { id, ...data }
});
})
.map(members => {
return { chatId, ...chatData, members: members };
});
})
})
.flatMap(chats => Observable.combineLatest(chats));
}
とサービスから
:getChatsFromFirestore() {
return this.fsd.collection<any>('chats');
}
getChatFromFirestoreById(id: string) {
return this.fsd.doc(`chats/${id}`);
}
getMembersForChat(chatId) {
return this.getChatFromFirestoreById(chatId).collection('members');
}
私はリアルタイムデータベース(のようなもの[この回答のためのプロセスごととしてデータを複製&非正規化のためにここに引数はありだと思います](https://stackoverflow.com/a/30699277/2754146))、Firestoreでデータを結合するための別の/より良いプロセスがあることを期待しています。 – Grimthorr
良い点と私はこのケースでは、データを捨ててデノーミングしました。たとえば、各チャットには、そのメンバーのすべてのデータを取得するために使用できるUIDと一致するドキュメントIDがあり、ユーザーの名前も含まれています。個々のメッセージには、そのユーザーのUIDを保持している "authorName"フィールドと "sentBy"フィールドも含まれています... DBへの再帰呼び出しや少なくとも冗長性のないチャットルーム文書の下にあるすべてのネストされたデータコードはクールだ。 – Methodician
'chatDocument'をIDとしてフィールドに保存すると、' .valueChanges() 'を使ってIDを取得できます。これは '.snapshotChanges()'より高速です。 – Hareesh