给出两个表:
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。这听起来太复杂了。
执行此操作的最有效查询是什么?
答案 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
}