ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-11 04:35:50  阅读:283  来源: 互联网

标签:firebase reactjs google-cloud-firestore javascript


我使用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,'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.

有没有可能做这样的事情?我真的不能一次查询多个位置并将它们组合在一起,因为这违反了能够限制data和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.

标签:firebase,reactjs,google-cloud-firestore,javascript
来源: https://codeday.me/bug/20191211/2106465.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有