我使用cloudstore .where查询在Firebase上遇到麻烦.
我想查询大量的文档(在我的情况下为帖子),但我只想查询groupId与用户所在的任何组匹配的帖子.原因是我想查询组合的为用户提供所有最新的相关数据(使用orderBy和limit).
我知道我可以使用数组包含的元素,因此可以查询用户所属的所有帖子.
firebase.db.collection('posts').where('members','array-contains',firebase.uid)
如果我决定跟踪组中的成员,这将起作用.问题是,如果我要更改组中的成员,则必须遍历所有帖子并更改成员的数组(这不是很好的做法).最好是让该帖子包含该帖子所属的组的ID.
假设用户有一个数组,其中包含他所在的所有组
user.groups = [‘companyGroup’,'{id}’,'{id2}’]
然后,我想查询整个posts集合,并获取其中groupId字段与user.groups中的任何值匹配的所有文档,如下所示:
firebase.db.collection('posts').where('groupId','==',[any of user.groups])
或相反:
firebase.db.collection('posts').where(user.groups,'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.
有没有可能做这样的事情?我真的不能一次查询多个位置并将它们组合在一起,因为这违反了能够限制data和orderBy字段的目的.我知道我可以在每个用户下放置一个名为Feed的新集合,并且对于每个帖子都使用一个firebase函数,该函数会推送到相关成员Feed(仅id和LatestActivity),但是一旦该帖子更改(我是将要使用一个名为latestActivity的字段来根据相关性对数据进行排序,而且还要在删除帖子时使用),我需要遍历每个受影响用户下的所有文档,并更改值/删除文档.
任何想法都将不胜感激!
firebase.db.collection('posts').where('groupId',[any of user.groups])
您可以选择将ID作为字符串或引用(组文档的路径)存储在数组中.存储引用而不是字符串并没有真正的优势,因此由您来决定使用哪种引用更合适.
要获取所有组文档,您应该获取包含这些ID /引用的数组,并为每个数组分别创建一个新的数据库请求.因此,不幸的是,没有其他方法可以使用单个查询一次获取这些组文档.
但是,创建额外的数据库调用并不意味着获取3个文档比获取一个文档要慢3倍.您可以自己进行一些测试.
我引用@Frank van Puffelen的话,“ Firebase在这种情况下具有良好的性能,因为它的历史记录是pipelines the requests.”