此问题与Parse.com相关
我想构建一个推送查询,将通知从云代码推送到属于“主持人”角色的所有用户。
我尝试了下面的代码,它没有推动,因为“用户”是一种关系,而不是一个对象。
var moderatorQuery = new Parse.Query(Parse.Role);
moderatorQuery.equalTo("name", "Moderators");
// Push to devices belonging to these moderators
var pushQuery = new Parse.Query(Parse.Installation);
pushQuery.matchesKeyInQuery("installationOwner", "users", moderatorQuery);
另一种方法是通过获取Moderator角色对象并使用relation.query()或在主持人对象上调用getUsers()。
但我的要求是直接推送查询而不提取(获取/查找)任何对象。 如何构建这样的查询?
答案 0 :(得分:0)
我认为首先需要获得该角色,然后使用它的用户关系查询作为要在pushQuery中匹配的查询,如下所示:
var moderatorQuery = new Parse.Query(Parse.Role);
moderatorQuery.equalTo("name", "Moderators");
moderatorQuery.first().then(function(moderatorRole) {
var pushQuery = new Parse.Query(Parse.Installation);
var usersQuery = moderatorRole.relation("users").query();
pushQuery.matchesQuery("installationOwner", usersQuery);
// setup push, then send()
});
编辑 - 错过了问题的最后一句话。简短的回答是,没有办法查询"很多"单个查询中关系的一面。
答案越长,可以使用其他数据完成。您可以使查询保持单一,但代价是保持其他数据是最新的。
例如,您可以在User
上保留(a)isModerator bool,或者更一般地说,(b)"角色" 指针数组(不是关系,因为这是你的根本问题)User
上,或(c)一个单独的表连接Role
和{{ 1}}带有奇异的指针。
所有这些想法使单一查询变得简单(a)查询User
其中isModerator == true,(b)查询User
其中role isEqual to moderator,(c)查询TheJoinTable where role ==主持人,包括用户和选择用户。
这样做可以减轻查询的负担,使额外的数据保持最新。您可以在角色 - 用户关系的任一端(可能是User
)使用beforeSave
来完成此任务。
所有这一切,你应该非常仔细地检查单个查询的附加约束,并确保它值得额外的麻烦。