【问题标题】:Can we not query collections inside transactions?我们不能在事务中查询集合吗?
【发布时间】:2018-10-08 20:21:18
【问题描述】:

查看https://firebase.google.com/docs/reference/js/firebase.firestore.Transaction我看到了四种方法:删除、设置、获取、更新。

我正要构建一个可爱的小集合查询并将其传递给 .get,但我看到文档说 .get “读取提供的 DocumentReference 引用的文档。”

这似乎意味着我们无法使用 Transaction 对象获取集合或查询集合。

可以使用查询的 .get() 方法而不是事务的 .get() 方法来查询那些,但是如果集合从我下面发生变化,则事务将以不一致的方式结束状态而不重试。

看来我在这里碰壁了。我的理解正确吗?我们不能以一致的方式访问事务中的集合吗?

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    您可以在事务的get() 方法中运行查询(不仅仅是获取单个文档),但这仅适用于服务器执行。因此,如果您确实需要这样做(例如为了维护非规范化数据的一致性),您可以将该代码放在云函数中并利用服务器端事务

    【讨论】:

      【解决方案2】:

      我不明白。 这段代码可以吗?我没有看到其他方法:

      admin.firestore().runTransaction(async t => {
      const query = admin
          .firestore()
          .collection('coll')
          .where('x', '==', true);
          const results = await query.get(); //this line is crucial
      results.forEach(r => t.update(r, ...)});
      

      ? 据说只要有人写信到集合,事务就会再次运行

      【讨论】:

      • 您能否链接到记录对事务内查询的支持的位置?我相信您的示例将成功查询和更新查询的文档。如果在事务期间更改了这些文档中的任何一个,它也会重新运行。但是,如果在执行的查询之间和事务完成之前添加了文档,则事务将不会重新运行。这意味着新添加的文档不会应用事务更新。
      【解决方案3】:

      你的理解是正确的。您必须确定在您的交易完成之前您希望确保不会更改的个人文件。如果这些文档提前来自集合查询,那很好。但是想一想,如果您必须跟踪(非常大的)集合中的每个文档以完成您的事务,那将是多么不可扩展。

      【讨论】:

      • 有道理!看起来我将使用一系列分布式计数器来做我想做的事情。感谢您的快速回答!
      • 它本质上不是不可扩展的,您可以在数据库中执行诸如表锁之类的事情。 Firestore 也可能有很多小型集合,因此在许多情况下它可能是高性能的。这只是 Firestore 的限制。
      • @WilGiesler 一个 SQL 表锁是 一个 锁,所有查询都可以轻松查询那个锁。 Firestore 根本不像 SQL。单独锁定 500 万个文档(这是 Firestore 处理数据的唯一方式 - 在文档级别,出于可扩展性目的)对于还需要扩展以支持 100 万个并发连接的数据库来说非常糟糕。
      • 我的意思是,暗示用户 OP 要求一个本质上不可扩展的功能是不公平的。如果他们愿意,Firestore 可以允许事务锁定子集合,这将是一个有用的、高性能的功能,并且适用于许多用例。我不明白他们为什么不能将集合锁实现为 one 锁。
      • @WilGieseler 因为集合不是可以像桌子一样被锁定的“实体”——它在本质上完全不同。如果任意集合只是可锁定的,那么产品就不会像宣传的那样扩展,因为滥用该锁定会导致生产系统瘫痪(这显然不是这样的云产品的选择)。也就是说,如果您认为这是容易实现的目标,请随时提交功能请求,但老实说,我认为不会发生任何事情。 support.google.com/firebase/contact/support
      猜你喜欢
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 2016-02-29
      • 1970-01-01
      • 2020-03-03
      相关资源
      最近更新 更多