我有一个名为“国家”的集合,在这个集合中,有 25 个文档(25 个国家/地区)
当用户按下“选择国家/地区”按钮时,他将转到“国家片段”,当该片段开始时,我将从 Firestore 获取 25 个国家/地区。
假设用户多次访问CountrysFragment,每次用户访问该片段都会花费我25次读取,所以我决定使用这种方式来降低读取成本。
我使用 SharedPreferences 创建了一个密钥,并将该密钥命名为 lastCountriesUpdate。
我创建了一个检查上面的键是否为空。如果键的值为空,则意味着我应该从 Firestore 获取所有国家/地区。
否则,我将从 Countrys 集合中获取 LastUpdate 值大于 LastCountriesUpdate 值的文档。
一切运行良好,我降低了读取成本,但现在的问题是我如何知道是否有任何国家/地区从国家集合中删除以将其从客户端删除?
我如何知道是否有国家/地区从国家/地区中删除 集合以将其从客户端删除?
默认情况下,您只能通过获取集合(或者通过获取您知道可能已被删除的特定文档,但这与我认为的用例不符)来知道。
一种可能成本较低的替代方法可能是:
Countries
集合的最后更新的 时间戳保留在特定集合中的唯一文档中(例如像
countriesLastUpdate/lastUpdate
这样的文档路径),并且;更准确地说,这意味着:
lastUpdate
文档,读取时间戳值并将其存储在您的应用程序中。lastUpdate
文档并检查时间戳是否已更改。如果没有更改,您将使用应用程序中保存的当前列表,如果它已更改,您会像第一次一样。lastUpdate
文档。最好的解决方案是使用 Cloud Function 和 onWrite
触发器。云功能将非常简单:
exports.countriesLastChangeUpdate = functions
.firestore
.document('countries/{docId}')
.onWrite((change, context) => {
return admin.firestore().doc('countriesLastUpdate/lastUpdate').set({lastUpdate: context.timestamp});
});
请注意,国家文档删除(或创建或更改)与云功能完成(冷启动和执行时间)之间可能存在微小的时间滞后。如果您想避免这种情况,您可以通过云功能执行国家/地区文档删除,该功能将通过批量写入同时更新
lastUpdate
文档。
另一种变体是在您第一次获取集合时将当前时间戳存储在您的应用程序中,随后检查
lastUpdate
文档中存储的时间戳是否晚于应用程序中存储的时间戳。您可以避免初次阅读 lastUpdate
文档。