web-dev-qa-db-fra.com

Firestore Récupération des documents de la collection

J'essaie de récupérer mes documents avec un identifiant, mais je n'arrive pas à le comprendre.
Actuellement, je récupère mes documents comme ceci: 

const racesCollection: AngularFirestoreCollection<Races> = this.afs.collection('races');
return racesCollection.valueChanges();

Je reçois ma liste de documents à la perfection, mais il n’ya pas de doc id avec eux.

Comment puis-je le récupérer pour chaque document?

13
DominikG

J'ai enfin trouvé la solution. Victor était proche avec les données du doc.

const racesCollection: AngularFirestoreCollection<Race>;
return racesCollection.snapshotChanges().map(actions => {       
  return actions.map(a => {
    const data = a.payload.doc.data() as Race;
    data.id = a.payload.doc.id;
    return data;
  });
});

ValueChanges () n'inclut pas les métadonnées; nous devons donc utiliser SnapshotChanges () lorsque nous avons besoin de l'ID de document, puis le mapper correctement comme indiqué ici https://github.com/angular/angularfire2/blob/master/docs/ Firestore/Collections.md

19
DominikG

Pour obtenir l'id des documents d'une collection, vous devez utiliser snapshotChanges()

this.shirtCollection = afs.collection<Shirt>('shirts');
// .snapshotChanges() returns a DocumentChangeAction[], which contains
// a lot of information about "what happened" with each change. If you want to
// get the data and the id use the map operator.
this.shirts = this.shirtCollection.snapshotChanges().map(actions => {
  return actions.map(a => {
    const data = a.payload.doc.data() as Shirt;
    const id = a.payload.doc.id;
    return { id, ...data };
  });
});

Documentation https://github.com/angular/angularfire2/blob/7eb3e51022c7381dfc94ffb9e12555065f060639/docs/firestore/collections.md#example

24
Luis Ruiz Figueroa

Pour angular6 +

this.shirtCollection = afs.collection<Shirt>('shirts');
this.shirts = this.shirtCollection.snapshotChanges().pipe(
    map(actions => {
    return actions.map(a => {
        const data = a.payload.doc.data() as Shirt;
        const id = a.payload.doc.id;
        return { id, ...data };
    });
    })
);
19
phicon

Peut obtenir un identifiant avant d'ajouter des documents dans la base de données:

var idBefore =  this.afs.createId();
console.log(idBefore);
2
Diego Venâncio

J'ai essayé ça!

colWithIds$<T>(ref: CollectionPredicate<T>, queryFn?): Observable<any[]> {
    return this.col(ref, queryFn).snapshotChanges().pipe(
    map(actions => {
      return actions.map(a => {
        const data = a.payload.doc.data();
        const id = a.payload.doc.id;
        return { id, ...data };
      });
    }));
  }

mais je rencontre cette erreur

[ts] Les types de diffusion ne peuvent être créés qu'à partir des types d'objet . const données: T

0
Jacques Schalkwyk