gpt4 book ai didi

javascript - Firebase Firestore - 查询大集合中的帖子,其中 groupId 应与数组中的值匹配

转载 作者:行者123 更新时间:2023-11-29 10:57:18 27 4
gpt4 key购买 nike

我在使用 cloudstore .where 查询时遇到了 Firebase 问题。我想查询大量文档(在我的案例中是帖子),但我只想查询 groupId 与用户所在的任何组匹配的帖子。这样做的原因是我想查询组合为用户提供所有最新的相关数据(使用 orderBy 和 limit)。

我知道我可以使用 array-contains,所以我可以查询用户所属用户的所有帖子。

firebase.db.collection('posts').where('members','array-contains',firebase.uid)

如果我决定跟踪群组中的成员,这会起作用。问题是如果我要更改组中的成员,我将不得不遍历所有帖子并更改成员数组(这不是很好的做法)。更好的办法是让帖子包含它发布在哪个组中的 ID。

假设用户有一个包含他所在的所有组的数组

user.groups = ['companyGroup', '{id}', '{id2}']

然后我想查询整个帖子集合并获取字段 groupIduser.groups 中的任何值匹配的所有文档,如下所示:

firebase.db.collection('posts').where('groupId','==',[any of user.groups])

或者反过来:

firebase.db.collection('posts').where(user.groups,'array-contains','groupId')

^ 我还没有尝试过这个,但我确定根据

的文档,它是行不通的

The where() method takes three parameters: a field to filter on, a comparison operation, and a value. The comparison can be <, <=, ==, >, >=, or array_contains.

有没有办法做这样的事情?我不能真正一次查询多个位置并将它们组合起来,因为这违背了能够限制数据和 orderBy 字段的目的。我知道我可以在每个用户下放置一个名为 feed 的新集合,并为每个帖子使用一个 firebase 函数来推送发布到相关成员的 feed(只有 id 和 latestActivity),但是一旦该帖子发生变化(我是将使用一个名为 latestActivity 的字段根据相关性对数据进行排序,但在删除帖子时也是如此)我需要遍历每个受影响的用户下的所有文档并更改值/删除文档。

非常感谢任何想法!

最佳答案

目前,没有办法将 id 数组传递给 where() 函数并期望获得与每个特定 id 相对应的所有文档:

firebase.db.collection('posts').where('groupId','==',[any of user.groups])

您的选择是将 id 作为字符串或引用(组文档的路径)存储在数组中。存储引用而不是字符串并没有真正的优势,因此您可以自行决定使用哪一个。

要获取所有组文档,您应该获取包含这些 ID/引用的数组,并为每个单独创建一个新的数据库请求。所以很遗憾,没有其他方法可以使用单个查询一次获取这些组文档。

但是,创建额外的数据库调用并不意味着获取 3 个文档的速度会比获取一个文档慢 3 倍。你可以自己做一些测试。

我引用@Frank van Puffelen 的话,“Firebase 在这种情况下一直表现良好,因为它 pipelines the requests.

关于javascript - Firebase Firestore - 查询大集合中的帖子,其中 groupId 应与数组中的值匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54577828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com