gpt4 book ai didi

node.js - Firestore 事务在单个事务中更新多个集合

转载 作者:行者123 更新时间:2023-12-05 08:39:59 25 4
gpt4 key购买 nike

我如何使用我搜索过但没有得到任何答案的单个事务来更新 firestore 中的多个集合。是否可以在单个事务中更新多个集合?

我想更新 branch.name at-once in classroom & students collection enter image description here

enter image description here

最佳答案

如 Node.js 客户端库文档中所述 update()方法,它返回一个 Transaction这是“用于链接方法调用”。 (请注意,Admin SDK 的 update() 方法的行为方式完全相同)。

因此,例如,如果在交易中您想从类文档中获取一个值,请增加它并使用它来更新来自两个不同集合(classroomsstudents)的两个文档),你会这样做:

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);
});

请注意,如果您需要在多次更新之前进行多次读取,“使用事务时,读取操作必须在写入操作之前进行。”


另一方面,IF YOU JUST WANT TO UPDATE 多个文档WITHOUT READING 一个或多个值(您在问题中说“想要更新分支。在类和学生集合中一次命名”),您不需要使用事务。只需使用 batched write ,如下:

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 () {
// ...
});

根据您的意见更新

在您的 Cloud Function 中,您可以很好地链接不同的 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); });

关于node.js - Firestore 事务在单个事务中更新多个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57653308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com