Firebase查询,从一个集合中获取多个文档,其中每个doc.id等于单独列表中的ID

时间:2020-10-15 20:31:01

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

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

我是本机和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的数组并查询我的posts集合以返回doc.id与提供的postId相匹配的那些帖子。

对于这不清楚或令人困惑的事情,我深表歉意,对此我感到有些茫然。

任何建议都将受到欢迎。

非常感谢您抽出宝贵的时间!

2 个答案:

答案 0 :(得分:1)

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

public class Test<A extends Action>{

    void someMethod(){
        System.out.println(A.CONSTANT_FIELD); // there would be the "cannot resolve symbol 
                                              // CONSTANT_FIELD" message
    }

}

但这仅在数组长度少于10个项目时有效(Firestore限制)。如果需要更多,则必须将ID批处理成较小的数组并执行多个查询,或者简单地迭代ID,然后分别const array = [...]; const snapshot = await firebase .firestore() .collection('posts') .where(firebase.firestore.FieldPath.documentId(), 'in', array) .get(); 单独处理每个文档(这很好,真的,不用担心有关该性能的信息。

答案 1 :(得分:1)

正在工作:)

非常感谢Doug Stevenson的帮助!

功能如下:

postedId是一个ID数组,表示“帖子”集合中已保存帖子的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;
 };`