Firestore AngularFire2 5.0 - id' s

时间:2018-02-13 18:44:33

标签: firebase google-cloud-firestore angularfire2

为什么获取存储在Firestore中的数据的ID与以前版本中可以直接访问$ key的ID一样严峻?我在下面的代码中以错误的方式解决这个问题吗?在Post模型中,我必须有一个可空的字符串字符串来直接存储它。

getCollection$(): Observable<Post[]> {
  return this.afs.collection<Post>()
    .snapshotChanges().map(actions => {
      return actions.map(a => {
        const data = a.payload.doc.data() as Post;
        const id = a.payload.doc.id;
        return { id, ...data };
      });
    });
}

另外,有没有办法返回通过add方法添加的新文档的ID?

this.afs.collection<Post>(this.path).add(data);

1 个答案:

答案 0 :(得分:0)

图书馆Angularfire2的作者决定了这种方式:),它第一次看起来很苛刻,但是当你习惯它时不再有问题。

您可以使用?定义一个可选参数,该参数可以在typescript link中使用。当您只关心id时,这将很容易,此处您只有一个可选参数。

但是当您需要.snapshotChanges()的更多元数据时,type:'added|removed|modified'fromCachenewIndexoldIndex扩展您当前的模型,如此官方所述doc会很方便。

export interface PostId extends Post { id: string; }

getCollection$(): Observable<PostId[]> {
  return this.afs.collection<Post>()
    .snapshotChanges().map(actions => {
      return actions.map(a => {
        const data = a.payload.doc.data() as Post;
        const id = a.payload.doc.id;
        return { id, ...data };
      });
    });
}

但请注意,无论您在何处获得此功能,都需要使用id扩展模型。

关于你的上一个问题

//generate an id from firestore
let tempId = this.afs.createId();
this.afs.collection<Post>(this.path).doc(tempId).set(data);