在没有transaction.get()的情况下启动firestore事务

时间:2018-03-13 09:13:28

标签: javascript firebase promise google-cloud-firestore

我想将文档从一个集合移动到另一个集合。因此,我想使用一个事务来创建新文档和2.删除旧文档。

我可以做以下工作:

db.runTransaction((transaction) => {
return transaction.get(docRef)
  .then(() => transaction.set(newDocRef.doc(docId), doc))
  .then(() => transaction.delete(docRef));

如何重写此代码以使用transaction.set()而不是transaction.get(),因为我已经拥有此上下文中的文档,因此它是多余的。区别在于transaction.get()会返回承诺,而transaction.set()会返回transaction

4 个答案:

答案 0 :(得分:3)

如果您不想阅读该文档,那么您应该使用批量写入。

Firestore Docs: https://firebase.google.com/docs/firestore/manage-data/transactions

批量写入

  

如果您不需要阅读操作集中的任何文档,那么您   可以作为包含的单个批处理执行多个写操作   set(),update()或delete()操作的任意组合。一批   写入以原子方式完成,可以写入多个文档。

答案 1 :(得分:1)

我担心你不能这样做......

交易文档: https://firebase.google.com/docs/firestore/manage-data/transactions

  

使用交易时,请注意:

     
      
  • 读取操作必须在写入操作之前进行。

  •   
  • 一个功能      调用事务(事务函数)可能会运行超过      一旦并发编辑影响该事务的文档      读取。

  •   
  • 交易功能不应直接修改应用程序      状态。

  •   
  • 当客户端离线时,交易将失败。

  •   

答案 2 :(得分:0)

启用持久性后,我会使用事务,并且我希望在没有Internet连接时某些文档创建失败。这是我的方法:

let docRef = db.collection("my-collection").doc();
db.runTransaction(async transaction => transaction.set(docRef, { field: "value"}));

答案 3 :(得分:0)

将“ transaction.set”包装在Promise中:

db.runTransaction((transaction) => {
return Promise.resolve(transaction.set(newDocRef.doc(docId), doc))
  .then(() => transaction.delete(docRef));