You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:15:09