Python 如何在Firestore中的两个不同集合之间移动文档?

Python 如何在Firestore中的两个不同集合之间移动文档?,python,firebase,google-cloud-firestore,Python,Firebase,Google Cloud Firestore,我正在Firestore中尝试将文档从一个集合“移动”到另一个集合。这意味着复制/粘贴文档,然后删除原始文档。我正在尝试使用Python实现这个服务器端 我知道我应该使用事务,所以我实现了一个。当我运行脚本时,我可以在Firestore中看到我所针对的文档确实已从旧集合中删除,并且在新集合中创建了一个新文档 成功 如何测试我编码的事务?我对事务逻辑本身有点困惑。特别是,我不确定如何在我的事务中实现“复制部分”(见下文)。为什么get()和delete()有对事务的引用,而set()没有 以下是我

我正在Firestore中尝试将文档从一个集合“移动”到另一个集合。这意味着复制/粘贴文档,然后删除原始文档。我正在尝试使用Python实现这个服务器端

我知道我应该使用事务,所以我实现了一个。当我运行脚本时,我可以在Firestore中看到我所针对的文档确实已从旧集合中删除,并且在新集合中创建了一个新文档

成功

如何测试我编码的事务?我对事务逻辑本身有点困惑。特别是,我不确定如何在我的事务中实现“复制部分”(见下文)。为什么get()和delete()有对事务的引用,而set()没有

以下是我迄今为止使用事务移动文档的代码:

从google.cloud导入firestore
导入时间
@firestore.transactional
def move_in_事务(事务,doc1,doc2):
#获取数据
doc=doc1.get(事务=事务)
如果存在文档:
打印(f'文档数据:{doc.to_dict()}')
其他:
打印(无此类文件)
#复制数据
doc2.set(doc.to_dict())
#删除原件
交易记录删除(单据参照)
def main():
db=firestore.Client()
transaction=db.transaction()
doc1=db.collection(u'AAA')。文档(u'111'))
doc2=db.collection(u'BBB')。文档(u'111')
事务\u尝试次数=0
尽管如此:
尝试:
#应用事务
在事务中移动事务(事务,doc1,doc2)
打印(“成功应用的交易”)
打破
例外情况除外,如e:
打印(f“无法应用事务。错误:{e}”)
时间。睡眠(5)
事务_尝试次数+=1
如果事务_尝试>10:
打印(f“停止尝试事务”)
退出()

它完成了任务,但我不确定事务本身中的“复制部分”。

现在您的
doc2.set(doc.to_dict())
发生在事务之外。这意味着可以修改
doc1
(并重试事务),但是
doc2
应该已经编写好了。最终状态可能是正确的(因为在事务重试时,
doc2
将得到更新),但您将暂时处于
doc1
doc2
都存在且内容不同的状态。正如我对你上一个问题的回答:这取决于你是否可以接受

如果您希望编写
doc2
作为事务的一部分,那么SDK中也有一个
transaction.set(…)
方法。看见

好的,明白了!我将set()更改为:
transaction.set(doc2,doc.to_dict())
。谢谢@Frank