Dam*_*tha 2 node.js firebase google-cloud-functions google-cloud-firestore
如何使用我搜索过的单个事务更新 firestore 中的多个集合,但没有得到任何答案。是否可以在单个事务中更新多个集合?
正如 Node.js 客户端库update()方法的文档中所解释的,它返回一个Transaction “用于链接方法调用”。(请注意,update()Admin SDK 的方法的行为方式完全相同)。
因此,例如,如果在事务中您想从课堂文档中获取一个值,增加它并使用它来更新来自两个不同集合(classrooms和students)的两个文档,您将执行以下操作:
const db = firebase.firestore(); //or admin.firestore() in a Cloud Function
const docRef1 = db.collection('classrooms').doc('classroomDocId');
const docRef2 = db.collection('students').doc('studentDocId');
let transaction = db.runTransaction(t => {
let newNumericValue;
return t.get(docRef1 )
.then(doc => {
newNumericValue = doc.data().numericValue + 1; //You calculate the new value
return t.update(docRef1 , {numericValue : newNumericValue});
}).then(t => {
return t.update(docRef2 , {numericValue : newNumericValue});
});
}).then(result => {
console.log('Transaction success!' + result);
}).catch(err => {
console.log('Transaction failure:', err);
});
Run Code Online (Sandbox Code Playgroud)
请注意,如果您需要在多次更新之前进行多次读取,“使用事务时,读取操作必须先于写入操作”。
另一方面,如果您只想更新多个文档而不读取一个或多个值(您在问题中说您“想要在课堂和学生集合中一次更新 branch.name ”),则不需要使用事务。只需使用批量写入,如下所示:
let batch = db.batch();
let cRef = db.collection('classrooms').doc('classroomDocId');
batch.set(cRef, {branch.name: 'newName'});
let sRef = db.collection('students').doc('studentDocId');
batch.update(sRef, {branch.name: 'newName'});
return batch.commit().then(function () {
// ...
});
Run Code Online (Sandbox Code Playgroud)
更新 关注您的评论
在您的 Cloud Functions 中,您可以很好地链接不同的 Firestore 查询(使用where())并在每个then()填充批次中,然后在最后一次then()提交批次中。请参阅下面的示例(只需根据正确的查询进行调整):
let batch = admin.firestore().batch();
return admin.firestore().collection('students').where('branch.id', '==', documentId).get()
.then((querySnapshot) => {
querySnapshot.forEach((doc) => {
batch.update(doc.ref, {branch: {id: documentId, name: after.name}});
});
return admin.firestore().collection('student_public').where('branch.id', '==', documentId).get();
})
.then((querySnapshot) => {
querySnapshot.forEach((doc) => {
batch.update(doc.ref, {branch: {id: documentId, name: after.name}});
});
return batch.commit()
})
.catch(err => { console.log('error===>', err); });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3126 次 |
| 最近记录: |