Cloud Firestore交易中,如果我们不知道文档名称,如何检查文档是否存在于特定集合中

时间:2018-07-01 20:21:13

标签: firebase transactions google-cloud-firestore

在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数据库中也是不可能的吗?交易中的查询违反了重要规则或其他规则吗?

1 个答案:

答案 0 :(得分:1)

听起来,您想要做的实际上是在事务内部进行查询,以查找要进行交易的文档。这在Firestore中是不可能的。您必须提前准确知道要在交易中使用哪些文件。

您可能应该首先查询其字段与所需字段相匹配的文档,将这些文档引用收集到一个数组中,然后在事务处理程序中迭代该数组以根据需要对其进行更改。