如何在Firestore中查询favoris子集合匹配当前用户id的文档并解决无返回问题
问题原因
你的代码存在两处核心错误导致查询无结果:
userDB.doc()无参数调用时会生成一个携带随机ID的全新文档引用,没有指向任何已存在的用户文档,自然无法查询到已有数据。- 如果你需要遍历所有带有
favoris子集合的用户,在他们的favoris子集合中筛选符合条件的文档,属于跨多个父文档的同名字集合查询,不能直接针对单个文档下的子集合发起查询。
解决方案
根据你的实际需求二选一即可:
场景1:查询全库所有用户的favoris子集合中符合条件的文档
使用Firestore的集合组查询能力实现跨父文档查询:
const getFavoris = () => { // collectionGroup 会匹配全库所有名为 favoris 的集合 db.collectionGroup('favoris') .where('id', '==', currentUser.id) .get() .then((querySnapshot) => { console.log('匹配的文档数量:', querySnapshot.size); querySnapshot.forEach((doc) => { // doc.ref.parent.parent 可获取当前favoris文档所属的用户文档引用 const belongUserId = doc.ref.parent.parent.id; console.log('所属用户ID:', belongUserId, 'favoris文档ID:', doc.id); }); }) .catch((err) => { // 如果报错提示缺少索引,直接点击报错信息里的索引创建链接,等待索引生效后再运行即可 console.error('查询失败:', err); }) };
场景2:仅查询当前登录用户自己的favoris子集合中的符合条件的文档
不需要用到集合组查询,只需要给doc方法传入当前用户的ID即可:
const getMyFavoris = () => { userDB.doc(currentUser.id) // 传入当前用户ID,指定要查询的用户文档 .collection('favoris') .where('id', '==', currentUser.id) .get() .then((querySnapshot) => { console.log('cmb', querySnapshot.size); querySnapshot.forEach((doc) => { console.log(doc.id); }); }); };
内容的提问来源于stack exchange,提问作者Xwingoga06
相关产品推荐
相关产品推荐

