আমি এখানে পর্যবেক্ষক এবং অ্যাঙ্গুলার ফায়ারের সাথে কাজ করছি মোড়কের তবে আমি কীভাবে এটি পরিচালনা করতে পেরেছিলাম তা এখানে।
এটি একধরণের পাগল, আমি এখনও পর্যবেক্ষণযোগ্যদের সম্পর্কে শিখছি এবং আমি সম্ভবত এটিকে ছাড়িয়েছি। তবে এটি একটি দুর্দান্ত অনুশীলন ছিল।
কিছু ব্যাখ্যা (কোনও আরএক্সজেএস বিশেষজ্ঞ নয়):
- গানের আইডি an একটি পর্যবেক্ষণযোগ্য যা আইডিকে নির্গত করে
- নাচ একটি পর্যবেক্ষণযোগ্য যা সেই আইডি পড়ে এবং তারপরে কেবল প্রথম মান পায়।
- এরপরে এটির সমস্ত উদাহরণ খুঁজে পেতে সমস্ত গানের সংগ্রহ গোষ্ঠীটি জিজ্ঞাসা করে।
- দৃষ্টান্তের ভিত্তিতে এটি পিতামাতৃ নৃত্যগুলিতে চলে যায় এবং তাদের আইডিগুলি পায়।
- এখন যেহেতু আমাদের কাছে সমস্ত ডান্স আইড রয়েছে তাদের তাদের ডেটা পেতে আমাদের জিজ্ঞাসা করা দরকার। তবে আমি চেয়েছিলাম এটি ভালভাবে সম্পাদন করুক তাই একের পর এক জিজ্ঞাসা করার পরিবর্তে আমি তাদের 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();
আমি আমার কোডটি পেস্ট করেছি এবং ভেরিয়েবলের নামগুলি আপনার কাছে পরিবর্তন করেছি, কোনও ত্রুটি আছে কিনা তা নিশ্চিত নয়, তবে এটি আমার পক্ষে ভাল কাজ করেছে। আপনি যদি কোনও ত্রুটি খুঁজে পান বা সম্ভবত কিছু মক ফায়ার স্টোর দিয়ে এটি পরীক্ষা করার আরও ভাল উপায়ের পরামর্শ দিতে পারেন তবে আমাকে জানান।