在parse-server中是否可以执行反向关系查询?
Parse 反向查询屏蔽当前用户的用户实现方案
方案1:直接对User表做Relation条件查询(最推荐)
你不需要操作ParseRelation对象,直接构造_User表的普通查询即可,代码实现如下:
ParseUser targetUser = ParseUser.getCurrentUser(); // 你要查询的被屏蔽的目标用户 ParseQuery<ParseUser> query = ParseUser.getQuery(); // 筛选所有blockedUsers关系中包含targetUser的用户,即所有屏蔽了targetUser的用户 query.whereEqualTo("blockedUsers", targetUser); List<ParseUser> usersWhoBlockedTarget = query.find();
该查询底层逻辑和你给出的第二条SQL完全等价:Parse会自动关联blockedUsers对应的中间表,匹配relatedId为目标用户ID的记录,返回对应的关联用户。
方案2:直接查询Relation中间表
如果你的Parse版本不支持方案1的查询语法,可以直接操作Relation对应的中间表查询,Parse的Relation中间表命名规则为_Join:关系字段名:所属类名,你场景下的中间表名为_Join:blockedUsers:_User,表中owningId对应屏蔽者ID、relatedId对应被屏蔽者ID,代码实现如下:
String targetUserId = ParseUser.getCurrentUser().getObjectId(); // 查中间表,筛选所有被屏蔽者为目标用户的记录 ParseQuery<ParseObject> joinQuery = ParseQuery.getQuery("_Join:blockedUsers:_User"); joinQuery.whereEqualTo("relatedId", targetUserId); // 注意:中间表默认无公开查询权限,需要使用MasterKey执行查询,建议放在云函数中运行 joinQuery.useMasterKey(); List<ParseObject> joinRecords = joinQuery.find(); // 提取屏蔽者ID批量查询用户信息 List<String> blockerIds = new ArrayList<>(); for (ParseObject record : joinRecords) { blockerIds.add(record.getString("owningId")); } ParseQuery<ParseUser> userQuery = ParseUser.getQuery(); userQuery.whereContainedIn("objectId", blockerIds); List<ParseUser> usersWhoBlockedTarget = userQuery.find();
方案3:冗余双写Relation字段(高性能场景推荐)
如果反向查询的需求非常频繁,可以在_User表额外新增一个blockedByUsers的Relation字段,每次用户A屏蔽用户B时,同时执行两个操作:
- 将B添加到A的
blockedUsers关系中 - 将A添加到B的
blockedByUsers关系中
后续查询谁屏蔽了当前用户时,直接取当前用户的blockedByUsers关系查询即可,性能比关联查询高很多,适合高并发场景,需要注意双写操作要保证事务一致性,建议放在云函数的hooks中统一处理。
内容的提问来源于stack exchange,提问作者Nobody Tells The Truth
相关产品推荐
相关产品推荐

