如何在Firebase Firestore中查询所有持有指定postId的用户对应文档
解决方案
你现有代码的逻辑需要提前获取到具体的用户ID才能查询对应子集合,无法跨所有用户的savedPosts子集合匹配指定postId,可以使用Firestore的集合组查询实现需求。
前置准备
- 先在Firebase控制台为
savedPosts集合组创建索引,首次执行查询时如果缺少索引,控制台会输出直接创建对应索引的跳转链接,点击后等待索引创建完成即可。 - 调整Firestore安全规则,为
savedPosts集合组开放对应的读写权限,示例规则如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 匹配所有用户下的savedPosts子集合 match /{path=**}/savedPosts/{targetPostId} { allow read, write: if request.auth != null; // 可根据业务调整权限条件 } } }
代码实现
1. 判断是否存在用户持有该postId的savedPost
Future<bool> hasUserSavedPost(String postId) async { // 集合组查询所有savedPosts子集合中id为postId的文档 final querySnapshot = await FirebaseFirestore.instance .collectionGroup('savedPosts') .where(FieldPath.documentId, isEqualTo: postId) .limit(1) // 只需判断存在的话加limit减少性能消耗 .get(); return querySnapshot.docs.isNotEmpty; }
如果需要获取持有该postId的用户ID,可以从查询到的文档路径中解析:doc.reference.parent.parent?.id 即为对应用户的uid。
2. 删除所有用户savedPosts中匹配的postId文档
Future<void> deleteSavedPostFromAllUsers(String postId) async { final querySnapshot = await FirebaseFirestore.instance .collectionGroup('savedPosts') .where(FieldPath.documentId, isEqualTo: postId) .get(); // 批量删除所有匹配的文档 for (var doc in querySnapshot.docs) { await doc.reference.delete(); } }
内容的提问来源于stack exchange,提问作者Alvaro-99
相关产品推荐
相关产品推荐

