मैं यहाँ वेधशालाओं और AngularFire आवरण के साथ काम कर रहा हूँ, लेकिन यहाँ बताया गया है कि मैं ऐसा कैसे कर पाया।
यह पागल की तरह है, मैं अभी भी वेधशालाओं के बारे में सीख रहा हूं और मैं संभवतः इसे पूरा कर रहा हूं। लेकिन यह एक अच्छा व्यायाम था।
कुछ स्पष्टीकरण (आरएक्सजेएस विशेषज्ञ नहीं):
- songId $ एक अवलोकनीय है जो आईडी का उत्सर्जन करेगा
- डांस $ एक अवलोकन योग्य है जो उस आईडी को पढ़ता है और फिर केवल पहला मूल्य प्राप्त करता है।
- तब यह सभी गानों के संग्रह समूह पर सवाल उठाता है ताकि इसके सभी उदाहरण मिल सकें।
- उदाहरणों के आधार पर यह मूल नृत्य के बारे में पता लगाता है और उनकी आईडी प्राप्त करता है।
- अब जब हमारे पास सभी डांस आईडी हैं, तो हमें उनका डेटा प्राप्त करने के लिए उन्हें क्वेरी करने की आवश्यकता है। लेकिन मैं यह चाहता था कि मैं एक के बाद एक अच्छे से प्रदर्शन करूं और मैं उन्हें 10 के बकेट में बैच करूं (अधिकतम कोणीय एक
in
क्वेरी के लिए ले जाएगा ।
- हम एन बकेट के साथ समाप्त होते हैं और अपने मूल्यों को प्राप्त करने के लिए फायरस्टार पर एन क्वेश्चन करने की आवश्यकता होती है।
- एक बार जब हम फायरस्टार पर प्रश्न करते हैं, तब भी हमें वास्तव में उस डेटा को पार्स करने की आवश्यकता होती है।
- और अंत में हम इसमें सभी नृत्यों के साथ एक एकल सरणी प्राप्त करने के लिए सभी क्वेरी परिणामों को मर्ज कर सकते हैं।
type Song = {id: string, name: string};
type Dance = {id: string, name: string, songs: Song[]};
const songId$: Observable<Song> = new Observable();
const dance$ = songId$.pipe(
take(1), // Only take 1 song name
switchMap( v =>
// Query across collectionGroup to get all instances.
this.db.collectionGroup('songs', ref =>
ref.where('id', '==', v.id)).get()
),
switchMap( v => {
// map the Song to the parent Dance, return the Dance ids
const obs: string[] = [];
v.docs.forEach(docRef => {
// We invoke parent twice to go from doc->collection->doc
obs.push(docRef.ref.parent.parent.id);
});
// Because we return an array here this one emit becomes N
return obs;
}),
// Firebase IN support up to 10 values so we partition the data to query the Dances
bufferCount(10),
mergeMap( v => { // query every partition in parallel
return this.db.collection('dances', ref => {
return ref.where( firebase.firestore.FieldPath.documentId(), 'in', v);
}).get();
}),
switchMap( v => {
// Almost there now just need to extract the data from the QuerySnapshots
const obs: Dance[] = [];
v.docs.forEach(docRef => {
obs.push({
...docRef.data(),
id: docRef.id
} as Dance);
});
return of(obs);
}),
// And finally we reduce the docs fetched into a single array.
reduce((acc, value) => acc.concat(value), []),
);
const parentDances = await dance$.toPromise();
मैंने अपने कोड को कॉपी किया और चर नामों को बदलकर आपके पास रख दिया, निश्चित नहीं कि कोई त्रुटि है या नहीं, लेकिन इसने मेरे लिए ठीक काम किया। अगर आपको कोई त्रुटि मिलती है तो मुझे बताएं या शायद कुछ नकली फायरस्टार के साथ इसका परीक्षण करने का बेहतर तरीका सुझा सकते हैं।