我正在使用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相匹配的那些帖子。
对于这不清楚或令人困惑的事情,我深表歉意,对此我感到有些茫然。
任何建议都将受到欢迎。
非常感谢您抽出宝贵的时间!
答案 0 :(得分:1)
您可以使用"in" query和FieldPath.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;
};`