我正在使用firebase构建一个简单的原生react应用程序,用户可以在其中创建帖子,查看其他用户的帖子列表,并且帖子可以保存为“保存的帖子”作为我的users集合中的一个子集合。
我刚接触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数组,并查询我的posts集合,以返回其中doc.id与提供的postId匹配的那些帖子。
如果这一点不清楚或令人困惑,我道歉,我在这一点上有点迷惑。
任何建议都将非常受欢迎。
非常感谢您的宝贵时间!
发布于 2020-10-16 05:01:43
您可以使用"in" query和FieldPath.documentId()一次查询多个文档ID
const array = [...];
const snapshot = await firebase
.firestore()
.collection('posts')
.where(firebase.firestore.FieldPath.documentId(), 'in', array)
.get();但这只在数组长度小于10个项目时才有效(Firestore限制)。如果需要更多,则必须将is批处理到较小的数组中并执行多个查询,或者简单地迭代is,然后分别对每个文档执行get() (这很好,真的,不用担心性能问题)。
发布于 2020-10-16 06:39:29
它正在工作:)
非常感谢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;
};`https://stackoverflow.com/questions/64379227
复制相似问题