AngularFire UPDATE - >哪里

时间:2018-02-15 14:31:26

标签: angular typescript firebase google-cloud-firestore angularfire2

我在这里找不到什么。我的问题是如何更新AngularFire中WHERE clausule中返回的文档:

constructor(private db: AngularFirestore) { }

var path = this.db.collection('users').doc('type').collection('customer')
.ref.where('name', '==', 'roger');

如何更新此用户?

var query = path.set/update..? 

不工作。

2 个答案:

答案 0 :(得分:1)

试试这个,查询将为您提供获取ID并执行更新所需的列表。

const query = this.db.collection('users').doc('type').collection('customer', ref => ref.where('name', '==', 'roger'));

query.snapshotChanges().map(changes => {
   changes.map(a => {
    const id = a.payload.doc.id; 
    this.db.collection('users').doc('type').collection('customer').doc(id).update({})
  })
}).subscribe();

答案 1 :(得分:1)

我不明白先前的答案是如何被接受的,因为该行为是错误的并且以无限循环结束({snapshotChanges()触发update(),订阅时再次触发snapshotChanges()而且,此angularfire synatx已过时,因此我将指出另一种方法。

要实现OP所寻找的行为,最佳实践是将文档ID存储在文档本身中。创建项目时,add()返回一个DocumentReference,其中包括刚插入的项目的ID。

示例实现为:

 create(user) {
    return new Promise<any>((resolve, reject) => {
      this.db
        .collection('users')
        .doc('type')
        .collection('customer')
        .add(user)
        .then(res => {
          this.updateUserId(res.id);  
        }, err => reject(err));
    });
  }

  updateUserId(id: string) {
    return this.db
      .collection('users')
      .doc('type')
      .collection('customer')
      .doc(id)
      .set({ id: id }, { merge: true });
  }

在这种情况下,将创建用户,此后立即更新id对象的user字段(因为Firestore文档ID仅在插入后可用)。现在,可以通过用户的文档ID轻松地更新用户。