TL-DR
我创建了一个 Flutter Firestore 帖子应用程序。我只想向用户展示他们尚未阅读的新帖子。
如何使用 Firestore 查询实现这一目标?
问题
每次用户看到帖子时,他们的 id 都会添加到帖子 views
字段中。
下次用户打开应用程序时,我只想展示他们尚未阅读的帖子。
问题是查询 array-not-contains
不受支持。如何实现该功能?
回答1
您将很难做到这一点,因为 Firestore 只能为您提供您对文档内容有所了解的文档。这就是索引的工作方式——通过记录文档中存在的数据。索引不会跟踪文档中不存在的数据,因为这基本上是无限量的数据。
如果您尝试跟踪用户看到的文档,您会考虑使用每个用户的布尔值将文档标记为“已看到”,或者在某处跟踪文档 ID。但正如您所见,您只能查询用户看过的文档,因为这是系统中存在的数据。
您可以做的是查询所有文档,然后查询用户看过的所有文档,然后从所有文档中减去看到的文档以获得未见过的文档。但这可能不会以您想要的方式扩展。 (这与 Firestore 索引在没有某些已知数据的情况下无法显示文档的问题本质上是相同的。Firestore 不会执行相当于 SQL table 扫描的操作,因为这将是您必须支付的大量读取为了。)
您可以通过确保每个文档中都有一个创建时间戳来伪造它,并为每个用户记录最近看到的文档的时间戳。如果您要求用户必须按时间顺序查看文档,那么您可以简单地查询创建时间戳大于用户看到的最新文档的时间戳的文档。这真的和 Firestore 一样好,因为您无法查询是否缺少数据。