Firestore получение id документов из коллекции

Я пытаюсь получить Мои документы с id, но не могу понять это.
В настоящее время я получаю свои документы следующим образом:

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

Я получаю список документов отлично, однако с ними нет идентификатора doc.

Как я могу получить его для каждого документа ?

6 ответов


чтобы получить идентификатор документов в коллекции, необходимо использовать 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 };
  });
});

документация https://github.com/angular/angularfire2/blob/7eb3e51022c7381dfc94ffb9e12555065f060639/docs/firestore/collections.md#example


Я, наконец, нашел решение. Виктор был близок с данными дока.

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() не включает метаданные, поэтому мы должны использовать SnapshotChanges (), когда нам требуется идентификатор документа, а затем правильно сопоставить его, как указано здесь https://github.com/angular/angularfire2/blob/master/docs/firestore/collections.md


для 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 };
    });
    })
);

doc.id получает UID.

объединить с остальными данными для одного объекта, например:

Object.assign({ uid: doc.id }, doc.data())


может получить ID перед добавлением документов в базу данных:

var idBefore =  this.afs.createId();
console.log(idBefore);

пробовали это!

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 };
      });
    }));
  }

но я сталкиваюсь с этой ошибкой

[ts] типы распространения могут создаваться только из типов объектов. данные const: T