我在这里找不到什么。我的问题是如何更新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..?
不工作。
答案 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轻松地更新用户。