2016-03-22 11 views
0

Wenn ein Beitrag in meiner Parse-Datenbank gefällt, möchte ich einen Push an den Autor über Cloud-Code senden.
Um Pushs an bestimmte Benutzer senden zu können, speichern alle Installationen die objectId des aktuellen Benutzers. Um den Autor des geliebten Beitrags zu finden, verwende ich die AbfrageMöglicher Parse-Fehler in matchesKeyInQuery

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

Das funktioniert gut: Ein einziger Push wird an den Autor gesendet.

Jetzt möchte ich diesen Push nur senden, wenn der Autor solche Pushs aktiviert hat. So speichert jeder Benutzer ein Push-Settings-Array mit Aktivierungsflags für verschiedene Pushs.
Ich verwende jetzt eine weitere Abfrage für alle Benutzer, die solche Schübe aktiviert:

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

Diese Abfrage korrekt liefert alle Benutzer, die solche haben drückt aktiviert.

Schließlich möchte ich die Abfrage für Installationen mit dem Autor als aktuellen Benutzer einschränken, durch diese Abfrage für Benutzer, die Pushs aktiviert haben. Dies wird in der folgenden Weise:

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

Da die alte Abfrage ohne die 3. Zeile 1 Benutzer zurückgibt, die neue Abfrage mit der zusätzlichen Beschränkung (matchesKeyInQuery) soll die gleichen Benutzer zurückgeben, da der Autor aktiviert drückt.
Aber gibt es 2 Benutzer, der Autor und ein anderer Benutzer, der den Beitrag mochte.

Meiner Ansicht nach sieht dies wie ein Parse-Fehler aus, da alle Einschränkungen für eine Abfrage ANDed sind.
Irgendwelche Ideen, vielleicht für einen Workaround?

Antwort

0

Ihre var "kPFObjectId" sollte zu "user" geändert werden. Die Standardparse Installation kommt mit dem Zeiger namens "user" und nicht "kPFObjectId". Ich kann Ihnen sagen, dass Im die gleiche Methode („matchesKeyInQuery“) verwendet und es funktioniert gut:

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, 
    }); 
}) 
+0

Vielen Dank für Ihre Antwort. Mein Problem ist jedoch, dass meine 'pushEnabledUserQuery' nur einen Benutzer ** zurückgibt, während' matchesKeyInQuery (..., ..., pushEnabledUserQuery) '** 2 Benutzer ** zurückgibt. Und das ist meines Wissens unmöglich, da 'matchesKeyInQuery' die Ergebnisse der ersten Abfrage filtern sollte und keine weiteren Ergebnisse liefern sollte. –

+0

kein Problem, so wie ich sagte, diese Funktion (matchesKeyInQuery) funktioniert gut für mich, so dass Sie wahrscheinlich einen anderen Fehler in Ihrem Code haben. Ich würde nicht denken, dass es einen Fehler in dieser Funktion gibt, wenn es für viele andere Leute funktioniert. aber du weißt, dass alles passieren kann :) – dang