查询以推送到属于特定角色的所有用户

时间:2015-02-24 12:42:45

标签: parse-platform push-notification

此问题与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()。

但我的要求是直接推送查询而不提取(获取/查找)任何对象。 如何构建这样的查询?

1 个答案:

答案 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来完成此任务。

所有这一切,你应该非常仔细地检查单个查询的附加约束,并确保它值得额外的麻烦。