我有一个名为用户的Firestore集合,每个用户都有一个生成的ID和字段得分:
console.log()
我使用redux-firestore,我想将所有用户的得分重置为0,例如
users
0e8X3VFL56rHBxxgkYOW
score : 4
3SeDjrgAWMmh3ranh2u
score : 5
我无法实现,因为更新方法需要文档ID
你知道怎么做吗?
答案 0 :(得分:5)
您可以获取集合中的所有文档,获取其ID并使用这些ID进行更新:
db.collection("cities").get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
var cityRef = db.collection("cities").doc(doc.id);
return cityRef.update({
capital: true
});
});
});
答案 1 :(得分:3)
由于某些奇怪的原因,已接受的答案(thehamzarocks)对我不起作用,所有文档均未更新。 AngularFire2中可能存在一个错误。无论如何,我决定遍历QuerySnapshot的docs数组而不是使用其forEach方法,并将每个更新添加到批处理队列中。批量处理批量操作比为每个更新操作发送新的更新请求更有效。
resetScore(): Promise<void> {
return this.usersCollectionRef.ref.get().then(resp => {
console.log(resp.docs)
let batch = this.afs.firestore.batch();
resp.docs.forEach(userDocRef => {
batch.update(userDocRef.ref, {'score': 0, 'leadsWithSalesWin': 0, 'leadsReported': 0});
})
batch.commit().catch(err => console.error(err));
}).catch(error => console.error(error))
}
答案 2 :(得分:0)
Firestore无法在不知道其ID的情况下批量更新文档。您将必须以某种方式知道每个文档的文档ID,以进行更新(执行查询或执行一批查询)并分别更新每个文档。
答案 3 :(得分:0)
批处理更新很好,但请记住,每个事务仅限于500个文档更新。 如果通常不进行此重置,则最简单的方法可能是:
async function resetScores() {
const collection = await db
.collection("users")
.get()
collection.forEach(doc=> {
doc.ref
.update({
score: 0
})
})
}
答案 4 :(得分:0)
我在寻找类似解决方案时遇到了这篇文章。 Firestore 现在有 batched writes,可以一次性更新所有文档。对于较少的文档,这可能是一个理想的解决方案。
更新@thehamzarocks 的回答:
const batch = db.batch()
db.collection('cities').get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
const docRef = db.collection('cities').doc(doc.id)
batch.update(docRef, { capital: true })
});
batch.commit();
});