我想将文档从一个集合移动到另一个集合。因此,我想使用一个事务来创建新文档和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
。
答案 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));