matchesKeyInQuery中可能存在Parse错误

时间:2016-03-22 08:20:58

标签: parse-platform constraints cloud-code pfquery

如果我的Parse数据库中的帖子很受欢迎,我想通过云代码向作者发送推送 为了能够向特定用户发送推送,所有安装都存储当前用户的objectId。要查找喜欢的帖子的作者,我使用查询

var userWhosePostWasLikedQuery = new Parse.Query(Parse.Installation);
userWhosePostWasLikedQuery.equalTo(kClassInstallationKeyCurrentUserId, userWhosePostWasLiked.id);

这很好用:向作者发送一次推送。

现在我只想在作者启用此类推送时才发送此推送。因此,每个用户存储推送设置数组,其中包含用于不同推送的启用标志 我现在对所有启用此类推送的用户使用另一个查询:

const User = Parse.Object.extend(kClassUser);
var pushEnabledUserQuery = new Parse.Query(User);
pushEnabledUserQuery.equalTo(kClassUserKeyPushSettings, kPushNotificationTypePostLiked);

此查询正确返回已启用此类推送的所有用户。

最终,我想通过此查询限制已启用推送的用户的查询以及作者作为当前用户的安装。这是通过以下方式完成的:

var userWhosePostWasLikedQuery = new Parse.Query(Parse.Installation);
userWhosePostWasLikedQuery.equalTo(kClassInstallationKeyCurrentUserId, userWhosePostWasLiked.id);
userWhosePostWasLikedQuery.matchesKeyInQuery(kClassInstallationKeyCurrentUserId, kPFObjectId, pushEnabledUserQuery);  

由于没有第3行的旧查询返回1个用户,因此具有附加约束(matchesKeyInQuery)的新查询应返回相同的用户,因为作者已启用了推送。
但是它会返回2个用户,作者和喜欢该帖子的其他用户。

根据我的理解,这看起来像一个Parse bug,因为对查询的所有约束都是AND 任何想法,也许是为了解决方法?

1 个答案:

答案 0 :(得分:0)

您的var“kPFObjectId”应更改为“user”。 默认解析安装带有名为“user”的指针,而不是“kPFObjectId”。 我可以告诉你,我使用相同的方法(“matchesKeyInQuery”),它运作良好:

Parse.Cloud.define("sendPushForChat", function(request, response) {
    var userId = request.params.userId;
    var groupId = request.params.groupId;

    var query = new Parse.Query('RecentActivity');
    query.equalTo('groupId',groupId);
    query.include('user');
    query.notEqualTo('user',  {__type: "Pointer", className: "_User", objectId: userId});

    var queryInstallation = new Parse.Query(Parse.Installation);
    queryInstallation.matchesKeyInQuery('user', 'user', query);

    var message = request.params.messageContent;
    Parse.Push.send({
        where: queryInstallation,
        data: {
            alert: message,
            badge: "Increment",
            title: "מה נשמע?"
        }
    }, {
        success: function() {
            console.log("Push for chat was successful");
            response.success('Push for chat was successful');
        },
        error: function(error) {
            console.error(error);
            response.error('error');
        },
        useMasterKey:true,
    });
})