【问题标题】:Firestore get docs based off value existing in arrayFirestore 根据数组中存在的值获取文档
【发布时间】:2020-05-15 18:42:13
【问题描述】:

在遵循最佳实践的同时,我在如何使用 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);
  });

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

TLDR - 如何进行 Firestore 查询以获取所有具有字符串数组中的值的文档?

【问题讨论】:

  • 我意识到这个问题有点宽泛,因为它考虑到在 firestore 中构建数据,我只是无法找到在 firestore 中创建提要功能的好例子。

标签: javascript firebase react-native google-cloud-firestore


【解决方案1】:

您可以为此使用"in" query

firestore()
    .collection('posts')
    .where('uid', 'in', [uid1, uid2, ...])

但您只能在该数组中使用 10 个元素。所以你可能不得不坚持你现在所拥有的。您将无法使用 Firestore 的分页 API。

对于这种情况,您唯一真正的选择是创建一个新集合,其中包含您要在一个位置查询的所有数据,因为没有真正的连接操作。像这样的重复数据对于 nosql 类型的数据库来说是很常见的。

【讨论】:

  • 是的,查询正是我正在寻找的,但我也看到了 10 个元素的限制。真的没有比将所有数据复制到一个地方更好的方法来构建 Firestore 中的社交媒体类型提要功能吗?听起来它在读取和写入方面会花费很多,并且在代码库中会过大。
  • 没有更好的办法。对于 Firestore 等可大规模扩展的数据库,数据重复是正常的。如果您不需要大规模的可扩展性,那么也许另一个数据库会更好。
猜你喜欢
  • 2020-11-20
  • 2019-02-04
  • 2017-01-23
  • 2023-03-08
  • 2018-07-30
  • 2019-05-28
  • 1970-01-01
相关资源
最近更新 更多