当前位置: 首页 > 知识库问答 >
问题:

Firestore获取与值数组中的项匹配的任何值

顾高扬
2023-03-14

在坚持最佳实践的同时,如何使用firestore进行一些关系查询,我面临着一点思维障碍。我正在创建一个feed功能,在这里你可以看到来自朋友的帖子。基本上,我的数据结构如下:

Friends (collection)
-friend_doc
  ...data
  friends_uid: [uid1, uid2]

Posts (collection)
-post_doc
  ...data
  posted_by: uid2

基本上,我正在进行一个查询,以获取friends_uid包含我的uid(本例中为uid1)的所有朋友。然后,一旦我将所有好友uid映射到一个数组,我想进行firestore查询,以获取Post_by字段等于该好友uid数组中的任何uid的帖子。我还无法制作类似的东西。

我知道这似乎是最方便的循环通过朋友uid的字符串数组,并为每个查询像:

  listOfUids.forEach(async (item) => {
    const postQuerySnapshot = await firestore()
      .collection('posts')
      .where('uid', '==', item)
      .get();
    results.push(postQuerySnapshot.docs);
  });

但这对于分页和限制数据来说是非常有问题的,因为我可能会收到大量的帖子。我可能只是太深入了这段代码,错过了一个明显的解决方案,或者我的数据结构有点缺陷。如有任何见解,将不胜感激。

共有2个答案

程枫
2023-03-14

对于任何想在firestore中实现类似“feed”类型功能的人来说,我最终解决了这个问题:

我在数据结构和帖子集合中添加了一个users_feed集合,并处理了在云函数内部生成提要的问题。users_feed集合充当中介,因此客户端只需要从中提取数据,而不是生成提要。所有繁重的工作都发生在云函数中。

在云功能中,每当发布(onCreate)或更新(onUpdate)帖子时,它都会获取发布该帖子的人的好友列表,并使用批写将其写入用户的feed集合中的所有feed。

我发现另一篇文章在提出结构时非常有用:哪一篇是获得社交媒体订阅源的最佳Firestore模式?

谭建章
2023-03-14

我想你正在寻找一个处于状态的。这样,最多可以传递10个值,它将返回字段与这些值中任何一个匹配的所有文档。

有关这方面的更多信息,请参阅Firebase文档中的in查询。

如果您有超过10个UID,您仍然必须执行多个查询并在客户端合并结果。

 类似资料:
  • 我在Firestore中收集了一组文档,其中有一个字段是字符串数组,这些是添加到数据中的标记。 用户可以通过在前端选择和取消选择这些标签来过滤数据,所以我正在做一个数组来查询Firestore。 然后,我在最佳匹配上对结果进行评分,因此匹配更多标签的文档被排序到顶部,并显示到页面顶部供用户使用。 我现在正试图用带有文档快照的startAfter作为光标和限制,对这些数据进行分页。但我需要确保,当限

  • 问题内容: 我有一些文件: 我想要得到的结果,其匹配的任何值一样 在这种情况下,我想得到结果:一个数组: 我该怎么办?谢谢。 问题答案: 您应该看一下MongoDB 中的运算符。然后将它与find一起使用,以使您的请求更快,可以使用方法:使用它,mongoDB将返回JS对象而不是Mongoose模型/对象。 然后,您可以在结果数组上使用方法: 希望对您有帮助, 最好的问候

  • 是否有一种方法来获取所有文档,其中数组字段不包含一个或多个值,现在有“数组-包含”,但是否有类似“数组-不包含”的东西?

  • 我有一些数组,如果它们包含类似的值,我想返回这些数组的名称。 我有我的变量,它有多个数组,名字要么是,要么是,要么是。包含的只是变量中某些数组中相同的值。我需要返回数组中包含、和的数组的名称。因此,对于这个示例,我需要返回:。 通过这个函数抛出它们时,我得到一个错误。如何获取返回的数组?

  • 我有一个,子数组总是包含5个数字-数字按大小排序,不能在子数组中重复,但是中可以有更多“相同”的子数组(具有相同数字的子数组)。 如何获得数字的组合(数组),其中该组合(或者更确切地说,由该$n数字组合生成的5个数字组合)将与的大多数子数组相匹配? 示例:的的所需结果将是,因为从该结果导出的总共有二十一个5个数字组合: 这些组合将匹配几乎所有的子数组(只有第二个和最后两个子数组超出范围)。 我曾尝

  • 检查条件是否与数组中的任何值匹配的最佳方法是什么? 例如,如果收到5xx错误,我想实现重试逻辑。 理想情况下,我想把所有5xx错误都放在一个列表或数组中,然后检查res.status代码是否等于任何5xx错误代码。 在Javascript中实现这一点的最佳方法是什么?我可以不用循环吗?