Firebase 为一个触发器写入4个返回,每个返回都是不同的docRef

Firebase 为一个触发器写入4个返回,每个返回都是不同的docRef,firebase,firebase-realtime-database,google-cloud-firestore,google-cloud-functions,Firebase,Firebase Realtime Database,Google Cloud Firestore,Google Cloud Functions,我想编写一个firestore函数,在创建新文档时使用它 它将更新两个不同的文档 例如,为了进行统计,可以将新的运动会话文档添加到会话集合中。 它将更新文档:年报表、季度报表、月报表和日报表 所以问题是,我如何为一个触发器编写4个返回,每个返回到不同的docRef 我是否需要使用相同的触发器编写4个独立的函数?或者我可以在一个函数中完成这一切?您可以通过将四次写入的承诺组合到对Promise.all()的调用中,并从函数中返回这些承诺来完成这项工作 请看一看前面的部分。您可以通过将四次写入的承诺

我想编写一个firestore函数,在创建新文档时使用它 它将更新两个不同的文档

例如,为了进行统计,可以将新的运动会话文档添加到会话集合中。 它将更新文档:年报表、季度报表、月报表和日报表

所以问题是,我如何为一个触发器编写4个返回,每个返回到不同的docRef


我是否需要使用相同的触发器编写4个独立的函数?或者我可以在一个函数中完成这一切?

您可以通过将四次写入的承诺组合到对
Promise.all()
的调用中,并从函数中返回这些承诺来完成这项工作


请看一看前面的部分。

您可以通过将四次写入的承诺组合到对
Promise.all()
的调用中,并从函数返回这些承诺来实现这一点


请查看或查看以前的一些文档。

如果您正在根据创建的新文档更新统计信息,则最好使用事务。这样,您将确保两个并发文档创建不会同时更新统计文档。您可以让一个事务从新文档中读取值,然后更新多个文档

如果您只是想在一个云函数中同时编写多个文档,请查看使用批处理写入

这两个选项的文档都可以在此处找到

使用这两种选项时,请注意,您只能以每秒一次的速率更新单个文档。如果您正在处理大量文档,那么您最好将新文档数据导入云数据流(通过云功能的PubSub),然后将定期更新传递回Cloud Firestore。如果这是你的用例,那么这个视频将是有用的

使用transaction和getAll的代码示例 这需要节点SDK 0.12.0或更高版本(管理员SDK>=5.9.1)


如果要根据创建的新文档更新统计信息,则最好使用事务。这样,您将确保两个并发文档创建不会同时更新统计文档。您可以让一个事务从新文档中读取值,然后更新多个文档

如果您只是想在一个云函数中同时编写多个文档,请查看使用批处理写入

这两个选项的文档都可以在此处找到

使用这两种选项时,请注意,您只能以每秒一次的速率更新单个文档。如果您正在处理大量文档,那么您最好将新文档数据导入云数据流(通过云功能的PubSub),然后将定期更新传递回Cloud Firestore。如果这是你的用例,那么这个视频将是有用的

使用transaction和getAll的代码示例 这需要节点SDK 0.12.0或更高版本(管理员SDK>=5.9.1)


使用批处理选项写入文档是一个不错的选择,但由于这些字段是计数器,因此在更新之前,我需要从文档中读取它们。批处理选项允许吗?(读取多个文档,然后使用批处理更新文档)您可以使用在一个事务中读取多个文档。一旦您拥有了所有文档,只需根据需要在事务中更新文档,然后再返回功能。文档中有错误(已报告)。数组应该获取对象0和1,而不是1和2。我可以在事务中使用写回吗?我正在尝试,但它返回我“函数返回了未定义的、预期的承诺或值”。如果可能,那么我如何在writeBatch.commit()之后关闭此事务函数;命令??我在答案中添加了一个代码示例。希望这会有帮助,我刚刚发现我的代码中有一个小的拼写错误。如果您已经复制了,请更新使用批处理选项写入文档是一个不错的选择,但由于这些字段是计数器,因此在更新之前,我需要从文档中读取它们。批处理选项允许吗?(读取多个文档,然后使用批处理更新文档)您可以使用在一个事务中读取多个文档。一旦您拥有了所有文档,只需根据需要在事务中更新文档,然后再返回功能。文档中有错误(已报告)。数组应该获取对象0和1,而不是1和2。我可以在事务中使用写回吗?我正在尝试,但它返回我“函数返回了未定义的、预期的承诺或值”。如果可能,那么我如何在writeBatch.commit()之后关闭此事务函数;命令??我在答案中添加了一个代码示例。希望这会有帮助,我刚刚发现我的代码中有一个小的拼写错误。如果您已经复制了它,请更新
const firestore = firebase.firestore();

let firstDocRef = firestore.doc('myCollection/document1');
let secondDocRef = firestore.doc('myCollection/document2');

return firestore.runTransaction(t => {
  return t.getAll(firstDocRef, secondDocRef).then(querySnapshot => {

    // Return just the data and map it to firstDoc and secondDoc (personal hack)
    querySnapshot = querySnapshot.map(doc => doc.data());
    let [firstDocData, secondDocData] = querySnapshot;

    // Increment the counters
    let firstUpdate = {myCounter: firstDocData.myCounter + 1};
    let secondUpdate = {myCounter: secondDocData.myCounter + 1};

    // Write the new data back to Cloud Firestore
    t.update(firstDocRef, firstUpdate);
    t.update(secondDocRef, secondUpdate);

  });
})
.then(() => {
  console.log('Transaction completed successfully');
})
.catch(err => {
  console.error(err);
});