swift - 解析 : How to query for a relation that contains exactly two objects?

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

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

最佳答案

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

首先,向您的 Group 类添加一个类型为 Number 的额外列(我们称之为“counter”)该字段需要保留参与其中的用户数量一组。因此,每次将用户添加到组中时,它的值也会增加 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
}

关于swift - 解析 : How to query for a relation that contains exactly two objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33746047/

相关文章:

ios - 放松 segue 不起作用

ios - 更改 iOS 中禁用的条形按钮项目的颜色

ios - 将 isTouchInside 设置为 false

ios - 使用预填充的 Parse 数据存储发送 iOS 应用程序

ios - 设置 UITabBarItem 角标(Badge)

arrays - 无法将字典转换为数组。 swift

ios - Swift 中心 View 水平比例

swift - parse.com 中的字典字段

javascript - 如何在 Parse Cloud Code 中获取对象

ios - 使用 Parse.com 进行多查询搜索