9

मैं फायरस्टोर दस्तावेज़ और गाइड के माध्यम से जा रहा हूं। नीचे मेरे कोड नमूने AngularFire2 का उपयोग करें। https://firebase.google.com/docs/firestore/manage-data/structure-dataफायरस्टोर में दस्तावेज़ों में घनिष्ठ संग्रह से डेटा प्राप्त करने का सबसे अच्छा तरीका क्या है?

वे संरचना इस तरह की सलाह देते हैं, लेकिन मैं नहीं दिख रहा है, जहां वे सभी डेटा कुशलतापूर्वक हो रही चर्चा:

के एक "चैट" संग्रह यहां दिए गए उदाहरणों के समान पर विचार करें। [यहाँ डालने चैट डेटा फ़ील्ड]

  • chatsCollection
    • chatDocument
      • :

        प्रत्येक चैट दस्तावेज़ गुण, सदस्यों का एक संग्रह है, और संदेशों का संग्रह है

      • membersCollection
        • memberDocument
          • [डालने सदस्य डेटा यहां खेतों]
      • messagesCollection
        • messageDocument
          • [डालने संदेश डेटा फ़ील्ड यहाँ]

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'); 
} 
+1

मुझे लगता है कि एक तर्क रीयलटाइम डाटाबेस के लिए प्रक्रिया के अनुसार डुप्लिकेट करने और डेटा denormalizing के लिए यहाँ वहाँ ([इस जवाब की तरह कुछ ] (https://stackoverflow.com/a/30699277/2754146)), लेकिन मैं यह भी उम्मीद कर रहा हूं कि फायरस्टोर में डेटा में शामिल होने के लिए एक अलग/बेहतर प्रक्रिया है। – Grimthorr

+1

अच्छा बिंदु और मैंने इस मामले में डेटा को थोड़ा सा किया और डेटा को अस्वीकार कर दिया। उदाहरण के लिए, प्रत्येक चैट में उसके सदस्य होते हैं जिनके पास एक यूआईडी से मेल खाता एक डॉक आईडी होता है जिसका उपयोग उस सदस्य के डेटा को प्राप्त करने के लिए किया जा सकता है, लेकिन इसमें उपयोगकर्ता का नाम भी शामिल है। प्रत्येक व्यक्तिगत संदेश में "लेखक नाम" फ़ील्ड और एक "भेजा गया" फ़ील्ड भी होता है जो उस उपयोगकर्ता के यूआईडी को दोबारा रखता है ... फिर भी, चैट रूम के तहत सभी घोंसला वाले डेटा को डीबी में रिकर्सिव कॉल किए बिना या कम से कम कम वर्बोज़ के साथ प्राप्त करने में सक्षम होना कोड शांत होगा। – Methodician

+0

यदि आप आईडी को 'chatDocument' के साथ फ़ील्ड के रूप में सहेजते हैं, तो आप '.valueChanges()' का उपयोग कर सकते हैं और आईडी प्राप्त कर सकते हैं। जो 'स्नैपशॉट चेंज() 'से तेज है। – Hareesh

उत्तर

0

दृष्टिकोण आप पोस्ट लगता है जैसे यह काम करेगा और एक बड़े चैट एप्लिकेशन के लिए आप शायद प्रत्येक चैटरूम में होने वाली प्रत्येक घटना को ट्रैक नहीं करना चाहते हैं क्योंकि यह बहुत अधिक डेटा हो सकता है।इसके बजाए क्लाउड फ़ंक्शंस और क्लाउड मैसेजिंग के साथ आवधिक अपडेट को संभालने के लिए केवल वही सदस्यता लेना बेहतर होगा।

एक सहायक फ़ंक्शन observeCollection का उपयोग करके साथ ही छोटे कोड पुनर्गठन के द्वारा यह सेवा को साफ कर देगा और प्रत्येक चैट रूम के लिए अवलोकन बनाएगा जो कि जब तक वे सदस्यता नहीं ले लेते हैं तब तक निष्क्रिय रहेंगे।

class Service { 
    // db is plan firestore/no angularfire 
    db: firebase.firestore.Firestore; 

    loadChatrooms() { 
     const chatsRef = this.db.collection('chats'); 
     return observeCollection(chatsRef) 
      .pipe(
       map(chats => { 
        return chats.map(chat => { 
         return { 
          chat, 
          members$: this.observeCollection(chat.ref.collection('members')), 
          messages$: this.observeCollection(chat.ref.collection('messages')), 
         }; 
        }) 
       }), 
      ); 
    } 

    // Takes a reference and returns an array of documents 
    // with the id and reference 
    private observeCollection(ref) { 
     return Observable.create((observer) => { 
      const unsubscribeFn = ref.onSnapshot(
       snapshot => { 
        observer.next(snapshot.docs.map(doc => { 
         const data = doc.data(); 
         return { 
          ...doc.data(), 
          id: doc.id, 
          ref: doc.ref 
         }; 
        })); 
       }, 
       error => observer.error(error), 
      ); 

      return unsubscribeFn; 
     }); 
    } 
} 

आवेदन में आप कर सकते थे तो केवल वर्तमान में चयनित चैटरूम के सदस्यों और संदेशों, जो डेटा की बचत होगी निरीक्षण। चूंकि इस पोस्ट को कोणीय एसिंक पाइप के साथ टैग किया गया है, इसलिए स्वचालित रूप से हाथ से सबस्क्रिप्टिस द्वारा स्विच करने में मदद मिलेगी।

अपने घटक में:

this.currentChat$ = combineLatest(
    service.loadChatrooms(), 
    currentlySelectedRoomId 
).pipe(
    map(([chats, selectedRoomId]) => { 
     return chats.first(chat => chat.id === selectedRoomId) 
    }) 
); 

अपने टेम्पलेट में:

<div *ngIf="currentChat$ as currentChat"> 
    {{ currentChat.name }} 

    <div *ngIf="currentChat.members$ as members"> 
     <div *ngIf="let member of members"> 
      {{ member.name }} 
     </div> 
    </div> 

    <div *ngIf="currentChat.messages$ as messages"> 
     <div *ngIf="let message of messages"> 
      {{ message.content }} 
     </div> 
    </div> 
</div> 
+0

अगर आगे सही दिशा में नेतृत्व किया जाता है तो आगे चर्चा करने में खुशी होगी। – adamduren

संबंधित मुद्दे

 संबंधित मुद्दे