如何在Firestore中检查是否存在具有给定ID的文档,而无需花费金钱?

时间:2020-03-29 19:44:25

标签: firebase flutter google-cloud-firestore

我有一个场景,其中有用户的电话号码,我想检查用户是否已经在我的应用程序中注册。为此,我在Firestore中有一个收藏。在此集合中,我将单个用户的联系电话作为文档。每当用户打开该应用并输入其手机号码时,该应用都会发送请求以使用

搜索特定文档
final snapShot = await Firestore.instance.collection('rCust').document(_phoneNumberController.text).get();

My database structure is as follows

由于这个原因,我的Firestore帐单增长很快。在仅有4-5个查询的情况下,我的读取次数从75个激增至293个。如果有人可以指导我如何有效地执行此操作,那将是非常不错的。

3 个答案:

答案 0 :(得分:3)

如果您想知道服务器上是否确实存在文档,则将始终使您花费阅读文档的费用。当前没有办法避免这种费用。这是访问可大规模扩展的索引的成本,它使您可以在潜在的数十亿个索引中找到1个文档。

您可以尝试先查询本地缓存,这不会花费任何费用。您可以通过向Source.cache传递get()参数来实现。如果要假设本地缓存中始终存在文档,则意味着该文档存在于服务器上,这将为您节省一份文档。但是,如果在服务器上删除了文档,则本地缓存查询将不正确。您仍然必须查询服务器才能确定。

答案 1 :(得分:2)

要检查文档是否存在,您可以根据需要使用documentSnapshot中的ORDER BY id DESC属性:

.exists

从该查询中,您选择的是单个文档,而不是集合。

因为我们看不到其他代码,所以我假设您的Firestore使用量实际上不是由于查询而增加,而是由于您在Firebase Web控制台中查看了文档。在网络上查看控制台也会产生费用,并一次列出300个文档。

答案 2 :(得分:0)

您可以检查它

if(snapShot.getResults().exists()) {
  // ...
}

如果您不想在每次将phoneNumber发送到文档时进行设置,而是只更新该号码,则应在要设置数据的文档上使用update("fieldToUpdate",value),而不要使用{{1} }