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

Swift 解析:如何查询恰好包含两个对象的关系?,swift,parse-platform,Swift,Parse Platform,给出两个表格: Users Groups 一个或多个用户可以是组的一部分。每个组都包含一个包含所有用户的关系列 我如何查询在其关系字段中有确切的用户列表作为成员的组 我试过了 query.whereKey(users, containsAllObjectsInArray: [userA, userB]) 但这给了我一个错误 Unsupported query operator on relation field: users (Code: 102, Version: 1.8.5) 另一方面

给出两个表格:

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。听起来太复杂了


要做到这一点,最有效的查询是什么?

显然,您想要实现的并不是一个简单的解决方案,因为解析是为可伸缩性和速度而设计的,因此不直接支持复杂的模式匹配。使用
containsAllObjectsInArray
约束时出现的错误是因为该约束适用于
Array
类型的字段,但不能用于
关系
字段。为了得到你想要的结果,你需要有点创造性。因此,我想到了一个可能使用内部查询的解决方案

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

现在,您可以编写一个查询,返回此计数器正好为两个且用户关系至少包含“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
}

你能添加多个
whereKey:@“users”equalTo:…
,它们似乎与包含在中的具有相同的效果。我认为你不能使用计数,IIRC所有精确匹配选项都基于数组而不是关系。我可能会编写一个云函数来处理杂乱无章的请求,这样至少你只需要从应用程序向服务器发出一个请求。计数器似乎是最简单的解决方案。我将尝试使用云代码来更新计数器。事实上,通过使用containedIn和where counter=用户数,可以简化查询,而无需内部查询。据我所知,containedIn将您的值与任何元素匹配,而不是与所有元素匹配。由于您希望将用户关系与所有值(给定user1和user2)匹配,因此我选择了内部查询方法。您是对的,对不起,我的意思是我将使用NSPredicate:
“users IN%@”,users
。Parse提供了一种使用谓词进行查询的方法:
PFQuery(className:predicate:)
我想说,您得到的是与
包含在
中相同的东西。我怀疑您可以在
NSPredicate
中使用
ALL
聚合运算符进行精确匹配,但遗憾的是,在解析查询中不支持它们。同样,您是对的,我实际上在查询中对两个用户都使用whereKey(equalTo:)来仅获取至少两个用户都是其成员的组。