【问题标题】:Firestore get for any value that matches item in array of valuesFirestore 获取与值数组中的项目匹配的任何值
【发布时间】:2020-05-15 18:39:44
【问题描述】:

在遵循最佳实践的同时,我在如何使用 Firestore 进行一些关系查询方面遇到了一点心理障碍。我正在创建一个提要功能,您可以在其中查看朋友的帖子提要。基本上我的数据结构如下:

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

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

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

我知道循环遍历朋友 uid 的字符串数组并为每个人进行查询似乎最方便:

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

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

【问题讨论】:

    标签: javascript google-cloud-firestore


    【解决方案1】:

    我认为您正在寻找 in 条件。这样,您最多可以传递 10 个值,它将返回该字段与这些值中的任何一个匹配的所有文档。

    有关这方面的更多信息,请参阅 in queries 上的 Firebase 文档。

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

    【讨论】:

      【解决方案2】:

      对于任何正在寻找如何在 Firestore 中实现类似“提要”类型功能的人来说,这是我最终解决它的方法:

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

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

      我发现另一篇文章在提出结构方面非常有用:Which is a more optimal Firestore schema for getting a Social Media feed?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多