解析:如何查询包含两个对象的关系?

时间:2015-11-16 22:44:22

标签: swift parse-platform

给出两个表:

Users
Groups

一个或多个用户可以成为群组的一部分。每个组都包含一个包含所有用户的关系列。

如何在其关系字段中查询具有完全用户列表的组?

我试过

query.whereKey(users, containsAllObjectsInArray: [userA, userB])

但这给了我一个错误

Unsupported query operator on relation field: users (Code: 102, Version: 1.8.5)

另一方面,如果我使用

query.whereKey(users, containedIn: [userA, userB])

我还获得了所需用户多于成员的群组。然后,我将循环遍历第一个查询中找到的所有组,并为每个组放置另一个查询,以检查该组的唯一成员是否为userA + userB。这听起来太复杂了。

执行此操作的最有效查询是什么?

1 个答案:

答案 0 :(得分:1)

显然,您想要实现的目标没有直接的解决方案,因为Parse是为可扩展性和速度而设计的,因此不直接支持复杂的模式匹配。使用containsAllObjectsInArray约束时出现的错误是因为该约束适用于Array类型但不能在Relation字段上使用的字段。要获得您想要的结果,您需要有点创意。所以我想到了一个可能使用内部查询的解决方案。

首先,在Number类中添加一个类型Group的额外列(让我们称之为'计数器')此字段需要保留属于组的用户数。因此,每次将用户添加到组时,也会将其值增加一,当您从该组中删除用户时,您会减少该值。在您的情况下,您可以使用此计数器值快速找出哪个组中只有两个成员。

现在您可以编写一个查询,该查询返回此计数器正好为2的组,并且用户Relation至少包含'user1'。此查询将成为您的内部查询。您的主查询现在只需要查看此内部查询返回的内容,并仅选择用户关系也包含“user2”的记录。鉴于在您的内部查询中满足“正好有两个用户”的条件,您最终会得到所有在其用户关系中只有两个用户('user1'和'user2')的组记录。

let innerQuery = PFQuery(className: "Groups")
innerQuery.whereKey("counter", equalTo: 2)  // exactly two users
innerQuery.whereKey("users", equalTo: user1) // at least user1 is there
let query = PFQuery(className: "Groups")
query.whereKey("objectId", matchesQuery: innerQuery) // exactly two users including user1
query.whereKey("users", equalTo: user2) // select groups which also have user2
query.findObjectsInBackgroundWithBlock {
    (comments: [PFObject]?, error: NSError?) -> Void in
    // Groups with exactly two users, user1 and user2
}