我们的应用程序中的 Firestore 数据库离线模式遇到了严重问题,我希望我们只是在某个地方犯了一个愚蠢的错误。鉴于这对我们来说绝对是一场精彩的比赛,任何意见都将不胜感激!一些细节...
我们有几个查询在使用 WiFi 时需要亚秒级的时间,但在离线时可能需要数分钟才能返回。
查询最终会返回正确的数据。
这些都是非常简单的查询。只需返回集合中父 ID 字段与特定值匹配的所有文档即可。
结果集非常小。有时只返回少量文档,但绝不超过 25 个。
它发生在多个查询上,因此它似乎并不特定于一种类型。
iOS 和 Android 都会发生这种情况。
我们正在使用 Xamarin 并使用 Plugin.CloudFirestore 库,该库运行良好。虽然它当然有可能与该库相关,但考虑到该库只是包装了本机 API 调用,这似乎值得怀疑。
有什么想法吗?预先感谢!
事实证明,在 GetDocument() 中离线时强制“源”缓存可以解决该问题。我们的多分钟查询现在已降至亚秒级。它们甚至比现在连接时更快。
当集合的离线缓存变大时,离线查询可能会变慢。 发生这种情况时,查询速度可能会变慢,因为本地设备不具备 Firestore 云服务大规模搜索许多文档的能力。 离线时,您不再获得查询性能随结果集大小扩展的保证。
解决此问题的选项是:
Firestore 不是一个“离线优先”的数据库,因此它目前还没有针对本地处理大量数据进行优化,缓存上没有索引,速度取决于您使用的设备、文档的大小和数量您收藏的文件。
如果发现这篇文章可能会帮助您优化离线查询:“为什么我的 Cloud Firestore 查询很慢”,更具体地说是第二个原因(“原因 #2:您的离线缓存太大”) .
首先了解离线模式如何工作非常重要:
...当您查询离线缓存中的文档时,Cloud Firestore 需要解压本地存储的每个文档以供集合使用 查询并将其与您的查询进行比较。或者换句话说, 后端的查询会根据结果集的大小进行缩放,但是 在本地,它们会随着集合中数据的大小而缩放 你正在询问。
...如果您在一个集合中有大量数据需要排序 通过,或者您只是在慢速设备上运行,本地操作 大型离线缓存可能会明显变慢。
这意味着在您的具体情况下,离线查询返回多少文档并不重要,重要的是您正在咨询的数据量有多大,特别是在您解释说您时的评论中 “在启动时执行多次读取”
然后这篇文章很好地解释了一些具体问题的解决方案,我将恢复一些要点,但我真的建议您查看完整的文章:
cacheSizeBytes
希望这些信息和建议可以帮助您了解和解决您的离线查询问题
只需添加具有更好格式的 Kotlin 代码的响应:
import com.google.firebase.firestore.Source
val source = if(cachedQuerySnapshot.metadata.isFromCache) Source.CACHE else Source.SERVER
for (queryItem in cachedQuerySnapshot) {
val items = db.collection(<path>)?.get(source)?.await()