Firestore Getting documents id from collection

2020-01-29 04:27发布

I'm trying to retrieve my documents with id but can't figure it out.
Currently I retrieve my documents like this :

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

I do get my documents list perfectly, however there is no doc id with them.

How can I retrieve it for each document ?

8条回答
在下西门庆
2楼-- · 2020-01-29 05:05

To obtain the id of the documents in a collection, you must use 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

查看更多
Emotional °昔
3楼-- · 2020-01-29 05:05

doc.id gets the UID.

Combine with the rest of the data for one object like so:

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

查看更多
爷、活的狠高调
4楼-- · 2020-01-29 05:07

Can get ID before add documents in database:

var idBefore =  this.afs.createId();
console.log(idBefore);
查看更多
Bombasti
5楼-- · 2020-01-29 05:09

Have tried this!

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

but I run into this error

[ts] Spread types may only be created from object types. const data: T

查看更多
唯我独甜
6楼-- · 2020-01-29 05:11

For 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 };
    });
    })
);
查看更多
爷的心禁止访问
7楼-- · 2020-01-29 05:16

For angular 8 and Firebase 6 you can use the option id field

      getAllDocs() {
           const ref = this.db.collection('items');
           return ref.valueChanges({idField: 'customIdName'});
      }

this adds the Id of the document on the object with a specified key (customIdName)

查看更多
登录 后发表回答