Firestore批量写入操作顺序保证

时间:2019-11-22 10:42:47

标签: firebase google-cloud-firestore

是否保证按批处理顺序执行调用操作?根据{{​​3}},尚不清楚。会被强制为仅(#0)->(#1)->(#2)而不是其他方式吗?

const batch = db.batch();

const nycRef = db.collection('cities').doc('NYC');
batch.set(nycRef, {name: 'New York City'}); // (#0)

const sfRef = db.collection('cities').doc('SF');
batch.update(sfRef, {population: 1000000}); // (#1)

const laRef = db.collection('cities').doc('LA');
batch.delete(laRef); // (#2)

return batch.commit().then(function () {
  // ...
});

2 个答案:

答案 0 :(得分:1)

如文档中所述:

  

一批写入可以自动完成,并且可以写入多个文档。

据此我理解(从理论上讲,我认为这应该是这样),同一批中的操作应在同一时间作为单个操作同时发生。原子地。

编辑 Here上有一篇有趣的文章介绍了批处理的工作方式。当您执行提交时,所有写操作都在同一时间执行(理论上,实际上是不可能的)。当状态完成且提交准备就绪时,应修改集合。通常,默认情况下,在批处理写入中,您不能依赖它们实际执行的顺序。例如,对于MongoDB,我知道有一些方法可以保留顺序(默认情况下不会发生这种情况)。我找不到与Firestore类似的东西,因此我想说,默认情况下,您不应依赖批处理中操作的最终顺序。

答案 1 :(得分:1)

批量更改没有订单。它们原子地一次发生或根本不发生。任何客户端都无法通过不完整的批处理获得数据库视图。

任何适用于该批处理文档的安全规则将同时看到所有文档。安全规则不会依次应用于各个文档。如果您在安全规则中使用getAfter()来获取从批处理中更改的文档的内容,则每次调用getAfter()都只会看到新数据。

从来没有中间状态可以显示从批处理中更新的文档不完整。

如果在可以批量更新的文档上有任何Cloud Functions触发器,则没有定义的执行顺序-它们可以并发执行,也可以按某种“随机”顺序执行。