【问题标题】:What is the best way to know if the document exists or is deleted from the collection?了解文档是否存在或从集合中删除的最佳方法是什么?
【发布时间】:2022-01-11 00:02:18
【问题描述】:

我有一个名为 Country 的集合,在这个集合中,有 25 个文档(25 个国家/地区)

当用户按下选择国家按钮时,它会将他带到 CountryFragment,当片段开始时,我将从 Firestore 获取 25 个国家/地区。

假设用户访问 CountryFragment 很多次,每次用户访问这个 Fragment 都会花费我 25 次读取,所以我决定使用这种方式来降低读取成本。

我使用 SharedPreferences 创建了一个密钥,并将密钥命名为 lastCountriesUpdate。

我创建了一个检查上面的键是否为空。如果键的值为空,则意味着我应该从 Firestore 获取所有国家/地区。

否则,我将从 Country 集合中获取 lastUpdate 值大于 lastCountriesUpdate 值的文档。

一切正常,我降低了读取成本,但现在的问题是我如何知道是否从国家集合中删除了任何国家以将其从客户端中删除?

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    我如何知道是否从国家/地区中删除了任何国家/地区 集合以将其从客户端移除?

    默认情况下,您只能通过获取集合(或通过获取您知道可能已被删除的特定文档,但这与我认为的用例不对应)来知道这一点。

    一种可能成本更低的替代方法是:

    1. 在特定集合中的唯一文档(例如,countriesLastUpdate/lastUpdate 之类的文档路径)中保留对 Countries 集合的最后更新的时间戳,并且;
    2. 每次您需要显示国家/地区列表时,您都获取此唯一文档(即只需读取一次)并检查时间戳是否已更改。

    更准确地说,这意味着:

    • 第一次需要显示国家/地区列表时,您获取集合并获取 lastUpdate 文档,读取时间戳值并将其存储在您的应用中。
    • 随后您需要显示国家/地区列表,您首先获取lastUpdate 文档并检查时间戳是否已更改。如果没有更改,则使用保存在应用中的当前列表,如果更改了,则第一次使用。
    • 您需要在后端每次集合发生变化时更新lastUpdate 文档。最好的解决方案是使用Cloud FunctiononWrite trigger

    云函数很简单:

    exports.countriesLastChangeUpdate = functions
        .firestore
        .document('countries/{docId}')
        .onWrite((change, context) => {
    
           return admin.firestore().doc('countriesLastUpdate/lastUpdate').set({lastUpdate: context.timestamp});
    
        });
    

    请注意,国家/地区文档删除(或创建或更改)与云功能完成(冷启动和执行时间)之间可能存在微小的时间延迟。如果您想避免这种情况,您可以通过云函数执行国家/地区文档删除,该函数将通过批量写入同时更新lastUpdate 文档。


    另一种变化是在您第一次获取集合时将当前时间戳存储在您的应用中,随后检查存储在lastUpdate 文档中的时间戳是否在存储在您的应用中的时间戳之后。您避免了对lastUpdate 文档的初始读取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 2020-06-08
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      相关资源
      最近更新 更多