Automatique JOINS :
DOC
expandRef<T>(obs: Observable<T>, fields: any[] = []): Observable<T> {
return obs.pipe(
switchMap((doc: any) => doc ? combineLatest(
(fields.length === 0 ? Object.keys(doc).filter(
(k: any) => {
const p = doc[k] instanceof DocumentReference;
if (p) fields.push(k);
return p;
}
) : fields).map((f: any) => docData<any>(doc[f]))
).pipe(
map((r: any) => fields.reduce(
(prev: any, curr: any) =>
({ ...prev, [curr]: r.shift() })
, doc)
)
) : of(doc))
);
}
COLLECTION
expandRefs<T>(
obs: Observable<T[]>,
fields: any[] = []
): Observable<T[]> {
return obs.pipe(
switchMap((col: any[]) =>
col.length !== 0 ? combineLatest(col.map((doc: any) =>
(fields.length === 0 ? Object.keys(doc).filter(
(k: any) => {
const p = doc[k] instanceof DocumentReference;
if (p) fields.push(k);
return p;
}
) : fields).map((f: any) => docData<any>(doc[f]))
).reduce((acc: any, val: any) => [].concat(acc, val)))
.pipe(
map((h: any) =>
col.map((doc2: any) =>
fields.reduce(
(prev: any, curr: any) =>
({ ...prev, [curr]: h.shift() })
, doc2
)
)
)
) : of(col)
)
);
}
Il suffit de placer cette fonction autour de votre observable pour qu'elle développe automatiquement tous les types de données de référence en fournissant des jointures automatiques.
Utilisation
this.posts = expandRefs(
collectionData(
query(
collection(this.afs, 'posts'),
where('published', '==', true),
orderBy(fieldSort)
), { idField: 'id' }
)
);
Note : Vous pouvez également saisir les champs que vous souhaitez développer comme deuxième argument dans un tableau.
['imageDoc', 'authorDoc']
Cela augmentera la vitesse !
Ajouter .pipe(take(1)).toPromise();
à la fin pour une version promise !
Voir aquí pour plus d'informations. Fonctionne avec Firebase 8 ou 9 !
C'est simple !
J
32 votes
Je pense que cette vidéo de l'équipe de firebase vous explique tout : youtube.com/watch?v=Elg2zDVIcLo (regarder à partir de 4:36)
25 votes
youtu.be/Elg2zDVIcLo?t=276
1 votes
Je n'aime pas imbriquer les collections dans firebase pour de multiples raisons. Si pour une raison quelconque, vous avez une autre collection de niveau racine que vous avez besoin de forer tout le chemin vers le bas sur une collection racine sœur ; disons 4 niveaux pour obtenir un document. Ceci est rendu beaucoup plus facile en utilisant des références et en utilisant simplement db.doc('some_saved_ref') plutôt que de faire correspondre tous les identifiants à nouveau... à partir de l'autre collection racine.