首页 > 解决方案 > Firestore 根据数组中存在的值获取文档

问题描述

在坚持最佳实践的同时,我在如何使用 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 查询以获取所有具有字符串数组中存在值的文档?

标签: javascriptfirebasereact-nativegoogle-cloud-firestore

解决方案


您可以为此使用“in”查询

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

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

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


推荐阅读