在Cloud Firestore交易中,当我们仅知道字段名及其值而不是文件名本身时,如何找出集合中是否存在文件?
*我知道收藏集的名称
*我不不知道文档名称
*我知道我要查找的field_name和field_value
例如,如果我不参与交易,则可以通过以下方式在python中进行操作
def if_Exists(self):
db = firestore.client()
docs = db.collection(u'cities').where(u'field_name', u'==', 'field_value').get()
for doc in docs:
if bool(doc.to_dict()):
return True
return False
但是例如在下面的代码示例(来自Google文档)中的事务中,我不知道如何使用where方法(在if_Exists()方法中使用的方法)
transaction = db.transaction()
city_ref = db.collection(u'cities').document(u'SF')
@firestore.transactional
def update_in_transaction(transaction, city_ref):
snapshot = city_ref.get(transaction=transaction)
transaction.update(city_ref, {
u'population': snapshot.get(u'population') + 1
})
update_in_transaction(transaction, city_ref)
也许唯一的方法是将我的文档名称更改为我的字段值,但我想确保是否只有这样? 谢谢
编辑以获取更多详细信息: 实际上,我只想检查该文档是否存在,以便可以防止在交易中添加重复的文档。如果我在我已经做过的交易之外做。这是行不通的。
例如,如果我同时从两台计算机上运行事务,最后我在集合中得到了具有相同field_name和field_value的重复文档。我以为我可以通过在事务中进行查询并从事务中返回(如果我已经拥有该文档)来解决此问题。
正如道格·史蒂文森(Doug Stevenson)所说,这是不可能的,所以我很好奇,为什么严格的限制使其无法在Firestore中拥有此功能?在SQL数据库中也是不可能的吗?交易中的查询违反了重要规则或其他规则吗?
答案 0 :(得分:1)
听起来,您想要做的实际上是在事务内部进行查询,以查找要进行交易的文档。这在Firestore中是不可能的。您必须提前准确知道要在交易中使用哪些文件。
您可能应该首先查询其字段与所需字段相匹配的文档,将这些文档引用收集到一个数组中,然后在事务处理程序中迭代该数组以根据需要对其进行更改。