Firestore array-not-contains 替代解决方案

Firestore array-not-contains alternative solution

TL-DR

我创建了一个 Flutter Firestore posts 应用程序。我只想向用户展示新的 post,他们还没有读过

如何使用 Firestore 查询来实现?

问题

每次用户看到 post,他们的 ID 都会添加到 post views 字段。

下次用户打开应用时,我只想展示 post 他们还没有读过的内容。

问题是不支持查询 array-not-contains。我如何实现该功能?

您将很难做到这一点,因为 Firestore 只能为您提供您对文档内容有所了解的文档。这就是索引的工作方式 - 通过记录文档中存在的数据。索引不跟踪文档中存在的数据而不是,因为那基本上是无限量的数据。

如果您正在尝试跟踪用户看到的文档,您会考虑使用每个用户的布尔值将文档标记为“已看到”,或者在某处跟踪文档 ID。但是正如您所见,您只能查询用户看过的文档,因为那是系统中存在的数据。

你可以做的是查询所有个文档,然后查询用户看过的所有文档,然后从所有文档中减去看过的文档,以获得看不见的文档文件。但这可能不会以您想要的方式扩展。 (这与 Firestore 索引在没有一些已知数据的情况下无法显示文档本质上是相同的问题。Firestore 不会执行相当于 SQL table 扫描的操作,因为这会导致大量读取你必须为此付费。)

您可以通过确保每个文档中都有一个创建时间戳来伪造它,并为每个用户记录最近看到的文档的时间戳。如果您要求用户必须按时间顺序查看文档,那么您可以简单地查询创建时间戳大于用户最近看到的文档的时间戳的文档。这真的和 Firestore 一样好,因为您无法查询数据是否缺失。