Database 在Firestore中处理复杂查询

Database 在Firestore中处理复杂查询,database,firebase,google-cloud-firestore,nosql,Database,Firebase,Google Cloud Firestore,Nosql,我有一个由评论、关注和用户组成的数据库。其中,用户跟随其他用户是由下表建模的多对多关系。总的来说,我的模式如下所示: 跟随(收集)-键:fid 以下(uid) 跟随器(uid) 查看(收集)-关键字:rid 标题(字符串) 作者(uid) 已过帐(时间戳) 用户(集合)-密钥:uid 已创建(时间戳) 电子邮件(字符串) 我想运行一个查询来获取用户跟踪作者的T最新评论。在SQL环境中,我将使用两个连接和一个where子句来实现这一点 让我们考虑一个用户遵循代码> N< /代码>人

我有一个由评论、关注和用户组成的数据库。其中,用户跟随其他用户是由下表建模的多对多关系。总的来说,我的模式如下所示:

  • 跟随(收集)-键:fid
    • 以下(uid)
    • 跟随器(uid)
  • 查看(收集)-关键字:rid
    • 标题(字符串)
    • 作者(uid)
    • 已过帐(时间戳)
  • 用户(集合)-密钥:uid
    • 已创建(时间戳)
    • 电子邮件(字符串)
我想运行一个查询来获取用户跟踪作者的
T
最新评论。在SQL环境中,我将使用两个
连接和一个
where
子句来实现这一点

让我们考虑一个用户遵循代码> N< /代码>人,他们跟随的每个人都有<代码> M< /代码>评论。我正在考虑查找所有

n
人的所有评论,然后丢弃所有早于
T
的评论,但要知道读取次数将是
n*m
。正如我们很容易预期的那样,
n>100
m>1000
,这不是一个可行的解决方案。我认识到在firestore中可能没有很好的方法来做到这一点。有什么建议吗


更新:对于一个类似的问题,给出了一个
nk
(其中
k
是一个任意限制)的读取次数解决方案。它还回答了一个更简单的问题:“获取每个关注者的
T
最新评论”而不是“获取所有关注者的
T
最新评论。”,建议在每次评论中保留所有关注者的最新副本,然后执行
whererraycontains
子句查找关注者。但是,如果用户
A
跟踪一个进行了
B\m
审查的用户
B\m
,我们将为每次跟踪或取消跟踪执行
B\m
写入操作。我们还将对我们的数据库进行大规模的非规范化,在数千个位置存储和更新相同的信息。

您的数据似乎高度相关,因此您最好的选择是切换到关系数据库。要在firestore中实现这一点,唯一的方法是完全反规范化您的数据,或者将大量查询链接在一起以获取您所需的所有数据,在我看来这两种方法都不理想。

您的数据似乎高度相关,因此您最好的选择是切换到关系数据库。要在firestore中实现这一点,唯一的方法是完全反规范化您的数据,或者将大量查询链接在一起以获取您所需的所有数据,我认为这两种方法都不理想。

Hi@thedeg123事实上,firestore并不适合这种类型的查询。您最好将数据读入数组/变量,并在此变量中进行搜索。一、 然而,我发现了一个与你类似的问题,其中有一些有趣的信息。你能检查一下这是否对你有帮助吗?@gso_gabriel只是稍微有点,最上面的答案()基本上是对我已经拥有的东西的分层解释。此外,它给出了与我上面考虑的相同的查询!通过对每个用户施加k个评论的任意限制进行调整,这意味着nk读取而不是nm。下一个答案是better(),但是如果用户A跟随一个有B_m评论的用户B,我们将为每个跟随执行B_m写入。Hi@thedeg123确实,Firestore不适合这种类型的查询。您最好将数据读入数组/变量,并在此变量中进行搜索。一、 然而,我发现了一个与你类似的问题,其中有一些有趣的信息。你能检查一下这是否对你有帮助吗?@gso_gabriel只是稍微有点,最上面的答案()基本上是对我已经拥有的东西的分层解释。此外,它给出了与我上面考虑的相同的查询!通过对每个用户施加k个评论的任意限制进行调整,这意味着nk读取而不是nm。下一个答案是better(),但是如果用户A跟随一个有B_m评论的用户B,我们将为每个跟随执行B_m写入。