मैं फायरस्टोर दस्तावेज़ और गाइड के माध्यम से जा रहा हूं। नीचे मेरे कोड नमूने AngularFire2 का उपयोग करें। https://firebase.google.com/docs/firestore/manage-data/structure-dataफायरस्टोर में दस्तावेज़ों में घनिष्ठ संग्रह से डेटा प्राप्त करने का सबसे अच्छा तरीका क्या है?
वे संरचना इस तरह की सलाह देते हैं, लेकिन मैं नहीं दिख रहा है, जहां वे सभी डेटा कुशलतापूर्वक हो रही चर्चा:
के एक "चैट" संग्रह यहां दिए गए उदाहरणों के समान पर विचार करें। [यहाँ डालने चैट डेटा फ़ील्ड]
- chatsCollection
- chatDocument
- :
प्रत्येक चैट दस्तावेज़ गुण, सदस्यों का एक संग्रह है, और संदेशों का संग्रह है
- membersCollection
- memberDocument
- [डालने सदस्य डेटा यहां खेतों]
- memberDocument
- messagesCollection
- messageDocument
- [डालने संदेश डेटा फ़ील्ड यहाँ]
- messageDocument
- :
- chatDocument
Firestore प्रश्नों उथले हैं, जो कभी कभी महान हो सकता है। मेरी समझ यह है कि गहरी पूछताछ और नेस्टेड संग्रह प्राप्त करने के लिए कोई बेक्ड-इन तरीका नहीं है। तो, यह करने के लिए सबसे अच्छा प्रथाओं और सबसे परेशानी मुक्त तरीके क्या हैं?
पल मैं पुन: प्राप्त करने रहा हूँ और आईडी के साथ वस्तुओं के लिए मानचित्रण स्नैपशॉट और अतिरिक्त प्रश्नों और मैपिंग के साथ मूल दस्तावेज़ डेटा पर नेस्टेड संग्रह डेटा जोड़ने पर, और मैं अपने दृष्टिकोण के साथ खुश नहीं हूँ, और यह जल्दी कर सकता है यहां तक कि denbalalized फायरबेस संरचनाओं के साथ भी।
इस कोड उदाहरण सिर्फ सदस्यों पर मैपिंग कर रहा है, संदेशों में जोड़ एक पूरी अन्य कहानी है ...
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');
}
मुझे लगता है कि एक तर्क रीयलटाइम डाटाबेस के लिए प्रक्रिया के अनुसार डुप्लिकेट करने और डेटा denormalizing के लिए यहाँ वहाँ ([इस जवाब की तरह कुछ ] (https://stackoverflow.com/a/30699277/2754146)), लेकिन मैं यह भी उम्मीद कर रहा हूं कि फायरस्टोर में डेटा में शामिल होने के लिए एक अलग/बेहतर प्रक्रिया है। – Grimthorr
अच्छा बिंदु और मैंने इस मामले में डेटा को थोड़ा सा किया और डेटा को अस्वीकार कर दिया। उदाहरण के लिए, प्रत्येक चैट में उसके सदस्य होते हैं जिनके पास एक यूआईडी से मेल खाता एक डॉक आईडी होता है जिसका उपयोग उस सदस्य के डेटा को प्राप्त करने के लिए किया जा सकता है, लेकिन इसमें उपयोगकर्ता का नाम भी शामिल है। प्रत्येक व्यक्तिगत संदेश में "लेखक नाम" फ़ील्ड और एक "भेजा गया" फ़ील्ड भी होता है जो उस उपयोगकर्ता के यूआईडी को दोबारा रखता है ... फिर भी, चैट रूम के तहत सभी घोंसला वाले डेटा को डीबी में रिकर्सिव कॉल किए बिना या कम से कम कम वर्बोज़ के साथ प्राप्त करने में सक्षम होना कोड शांत होगा। – Methodician
यदि आप आईडी को 'chatDocument' के साथ फ़ील्ड के रूप में सहेजते हैं, तो आप '.valueChanges()' का उपयोग कर सकते हैं और आईडी प्राप्त कर सकते हैं। जो 'स्नैपशॉट चेंज() 'से तेज है। – Hareesh