【问题标题】:Firestore transaction, implementing multiple getsFirestore 事务,实现多个获取
【发布时间】:2017-12-23 03:46:58
【问题描述】:

有人知道如何在 Firestore 事务中实现多个获取吗?

我有一个长度未知的 Firestore 引用数组,保存在 Firestore 中。每个参考都包含 {count: number} 我只想为每个参考添加一个。为此,我非常有信心我需要使用事务,并且文档说我可以使用多个获取,但我不确定如何实现它。

我认为我需要获取每个引用,将现有计数存储在一个数组中,将每个计数添加一个,然后将它们全部保存回 Firestore。每次我试图实现这一点时,我都会失败。在 Firestore 事务中使用多个获取的示例可能就是我需要开始的全部内容,但文档中不存在任何内容,或者我能找到的任何在线地方。

【问题讨论】:

    标签: transactions google-cloud-firestore


    【解决方案1】:

    您必须使用 Promise.all,因为您需要迭代 arrayOfReferences 的每个 firestore 引用。

    我给你做了一个例子,测试了一下,按照下面的代码:

    setCount(arrayOfReferences){
      return this.db.runTransaction(t => {
        return Promise.all(arrayOfReferences.map(async (element) => {
          const doc = await t.get(element);
          const new_count = doc.data().count + 1;
          await t.update(element, { count: new_count });
        }));
      });
    }
    

    要详细了解计数器在 Firestore 中的工作原理,您可以阅读documentation

    【讨论】:

    • 我无法在云函数中使用异步函数。我该怎么办 ? @Mateus Forgiarini da Silva
    • 如果您想使用外部输入/变量更新字段怎么办?
    • C.Banzet,你只需要将它作为参数传递给你的函数。
    【解决方案2】:

    Firestore 文档没有这样说,但答案隐藏在 API 参考中:https://cloud.google.com/nodejs/docs/reference/firestore/0.13.x/Transaction?authuser=0#getAll

    您可以使用Transaction.getAll() 而不是Transaction.get() 来获取多个文档。

    【讨论】:

    • 刚试过这个,我得到[ts] Property 'getAll' does not exist on type 'Transaction'.
    • 我可能是错的,但似乎 getAll 仅在 Firestore 的 NodeJS 库中可用。
    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 2018-05-19
    • 2019-07-20
    • 2019-12-30
    • 2018-05-11
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多