【问题标题】:Firebase Query, get multiple documents from a single collection where each doc.id is equal to the id in a seperate listFirebase Query,从单个集合中获取多个文档,其中每个 doc.id 等于单独列表中的 id
【发布时间】:2021-01-30 09:21:06
【问题描述】:

我正在使用 firebase 构建一个简单的 react-native 应用程序,用户可以在其中创建帖子,查看其他用户帖子的列表,并且可以将帖子保存为“已保存帖子”作为我的用户集合中的子集合。

我是 react-native 和 firebase 新手,所以这只是为了教育目的。

我在为我的“已保存”列表查询帖子时遇到了困难。目前,当用户单击“保存”按钮时,会在帖子 ID 中添加(或创建)“已保存帖子”的子集合。我不想将整个帖子数据重写到用户保存列表,只是为了通过帖子 ID 创建对帖子的引用。

我能够保存列表,但无法在 firestore 中查询与每个帖子 ID 关联的文档。

目前我可以根据用户id查询自己的帖子列表,因为authorID与用户uid匹配,我认为获取保存的帖子会相似。

这是我获取用户自己的帖子列表的代码:

userId 是表示 user.uid 的单个字符串

const getUserPosts = async (userId) => {
    const snapshot = await firebase
      .firestore()
        .collection('posts')
        .where('authorID', '==', userId)
        .get();
    let data = snapshot.docs.map((doc) => ({ id: doc.id, ...doc.data() }));
    return data;
};

这个函数被导出,然后包装在组件内的 try catch 语句中。

上述内容与获取已保存帖子的用户列表之间的区别在于,我需要输入多个不同的“postId”(相对于单个 userID),但 .get() 方法不接受用于第一个参数,它需要一个字符串。

为了快速总结,我需要一个方法或函数,我可以在其中获取一个 postId 数组并查询我的帖子集合以返回 doc.id 与提供的 postId 匹配的那些帖子。

如果这不清楚或令人困惑,我深表歉意,我对此有点迷茫。

非常欢迎任何建议。

非常感谢您的宝贵时间!

【问题讨论】:

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


    【解决方案1】:

    它正在工作:)

    非常感谢 Doug Stevenson 的帮助!!

    函数如下:

    postedId 是一个 id 数组,指的是 'posts' 集合中已保存帖子的 id

    `export const getSaveData = async (postedId) => {
     const array = [postedId];
     const snapshot = await db.collection('posts').get();
     const data = snapshot.docs.map((doc) => ({ postedId: doc.id, 
     ...doc.data() }));
     return data;
     };`
    

    【讨论】:

      【解决方案2】:

      您可以使用"in" queryFieldPath.documentId() 一次查询多个文档ID:

      const array = [...];
      const snapshot = await firebase
        .firestore()
          .collection('posts')
          .where(firebase.firestore.FieldPath.documentId(), 'in', array)
          .get();
      

      但这仅适用于数组长度少于 10 项的情况(Firestore 限制)。如果您需要更多,则必须将 ID 批量处理成更小的数组并执行多个查询,或者简单地迭代 ID,然后 get() 每个文档单独(这很好,真的,不用担心性能关于那个)。

      【讨论】:

      • 谢谢!我做了一些调整,它似乎工作!非常感谢您的帮助。
      • 如果您发现此答案有帮助,通常会在堆栈溢出时使用答案左侧的按钮对其进行投票并接受它作为正确答案。
      • 我试过了,但不幸的是我的“声誉”不足以让我这样做。当我单击upvote 按钮时,我不断收到此消息:“感谢您的反馈!声望低于15 的人的投票将被记录,但不要更改公开显示的帖子分数。”不过我只差 4 分,所以当我有更多的积分可以投票时,我会回来:)
      • 您应该能够就您的问题投票并接受 answers(而不是 cmets)。我现在输入的是评论。答案在上面以更大的字体显示。
      猜你喜欢
      • 1970-01-01
      • 2021-03-23
      • 2021-04-24
      • 2020-01-09
      • 2020-10-20
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多