小编Fre*_*tic的帖子

Firestore:如何设计数据模型以使查询数组中不存在的文档成为可能?

我正在尝试找到一种方法来使用 Firestore 正确设计我的数据模型。我正在寻找类似于 Tinder 的功能,根据您的位置向您显示尚未刷卡的人。

所以我最终得到了类似的东西:

  • User1 有一系列“见过的人”
  • “尚未见过用户”/ User2 他也是具有相同文档模型的用户
  • 它们都属于同一个“Users”集合
  • 我想查询这个User1还没有刷卡的所有用户

我知道您不能执行“array_not_contains”或“!=”之类的操作,因为您查询的所有字段都需要建立索引。

所以我想知道,是否可以对数据进行建模以使其工作,或者唯一的解决方案是放弃 Firebase,因为这种查询根本不可能?

一种替代方法是将所有用户之间的所有关系(及其状态)存储在集合中。但这也意味着,每当用户注册时,我都必须创建与用户数量一样多的文档,这真的很丑陋,并且制作了大量的文档。

编辑:

再次感谢您的答复,并对我迟到的答复表示歉意。

无需创建新的数据库调用,因为您首先已经获得了该区域的所有用户。

不 如果有一个很大的响应集,我会限制一个数字。(下例中为 5)。即使我不限制数量,在下一个数据库调用中,我如何知道已添加新人员以及如何仅检索这些人员。
如果它们可以向其他用户显示,我不会将它们从用户集合中删除。

PS:我忘记了Users Collection图片中的User4。

初始数据库状态

对于用户 1,获取 5 个首个匹配项,删除现有匹配项,显示用户 5。
对于 User2,获取 5 个第一个匹配项,删除现有的匹配项,显示 User4、User5。
用户选择后,用户将被添加到他们的列表中。用户集合保持不变。

第2步

对于用户 1,获取 5 个第一个匹配项,删除现有匹配项,即使我有用户 6、7,也没有任何内容可显示。
为了解决这个问题,我启动了第二个查询,获取新的匹配项,但是,用户使用应用程序的次数越多,我的查询就越多可能需要尝试向他显示他所在区域的现有用户。

也许我误解了您所说的“初始列表”,对我来说,它是从包含所有用户(有限制)的数据库中检索的列表对象。

编辑2:

你可以查看Alex Mamo的回答了解如何查询数组中不存在的文档。

让我解释一下我的用例以及为什么我认为这行不通。

我希望能够搜索我旁边的所有用户,为了尝试在 Firebase 中执行此操作,我存储了 Geopoint。Geopoint 目前无法真正与 Firebase 一起使用,因此我在云功能中使用 Geofirestore。
我根据用户的位置存储和更新用户的地理点,因此这意味着用户位置随时间变化。我限制了此函数返回的用户数量。

初始搜索

在我的初始状态下,我检索我旁边的用户(用户 1),得到 3 和 4。
假设我存储了最后检查的用户 ID,以便稍后将其用作查询的游标(用户 4)。

现在我的地理位置发生了变化,该区域的用户也发生了变化。我请求我旁边的下一批用户,并使用我之前的 userId/document 来“startAfter”(更多信息请参见此处
,请参见下图,这是行不通的。

第二次搜索

如果我使用光标(User4),我将采用 5,但不是 2,因为在返回列表中,如果我按 Id …

database-design firebase google-cloud-firestore

5
推荐指数
1
解决办法
1633
查看次数