webentwicklung-frage-antwort-db.com.de

Parse.com: Mit objectId finden Sie alle Objekte eines Benutzers

Ich habe eine Klasse zum Parsen, sagen wir Bilder. Jede davon gehört einem Benutzer. Der Verweis auf diesen Benutzer wird in der Tabelle "Pictures" als Pointer für den Benutzer gespeichert.

In meinem Cloud-Code versuche ich, alle Bilder eines Benutzers mithilfe des Hauptschlüssels zu erhalten. Folgendes ist mein Code:

Parse.Cloud.define("getPictures", function(request, response) {

  Parse.Cloud.useMasterKey();

  var query = new Parse.Query("Pictures");

  query.equalTo("user", request.params.user);

  query.find({
    success: function(results) {

      var status = "Found " + results.length + " pictures for userId " + request.params.user;
      response.success(status);

    },

    error: function() {

      status = "No pictures exist for userId " + request.params.user; 
      response.error(status);
    }
  });
});

Dieser Code gibt aus, dass zum Beispiel 0 Bilder für einen bestimmten Benutzer mit der ID 'xyz' vorhanden sind. Ich kann jedoch sehen, dass der Benutzer viele Bilder gespeichert hat.

Ich habe auch bestätigt, dass das Problem nicht bei der Verwendung des Master-Schlüssels liegt, da ich im Konsolenprotokoll sehe, dass der Code als Master ausgeführt wird. Wenn ich ein Bild nach objectId abfrage, kommt es auch in den Ergebnissen zum Ausdruck, was bedeutet, dass ACL hier nicht das Problem ist.

Ich denke, ich muss hier Beziehungen/Beitritte nutzen, aber ich bin mir nicht sicher, wie ich das machen soll.

12
zzlalani

Zeiger werden als Objekte in der Parse-Datenbank gespeichert. Wenn Sie also versuchen, eine Zeichenfolge mit der Funktion query.equalTo() mit einem Objekt zu vergleichen, wird nichts gefunden. So werden Zeiger gespeichert:

{
    __type: 'Pointer',
    className: '_User',
    objectId: user-object-id
}

Wenn Sie eine Klasse mit Zeigern abfragen und möchten, dass das gesamte Objekt verschachtelt ist, sollten Sie dies in Ihrer Abfrage festlegen:

var query = new Parse.Query('Pictures');
query.include('user');

Wenn ich in meinen Abfragen nach einer Zeigerspalte suchen möchte, vergleiche ich mein Benutzerobjekt mit dem verschachtelten Benutzerobjekt.

var user = new Parse.User();

// Set your id to desired user object id
user.id = your-user-id;

var query = new Parse.Query('Pictures');

// This include will make your query resut comes with the full object
// instead of just a pointer
query.include('user');

// Now you'll compare your local object to database objects
query.equalTo('user', user);
query.find({
    success: function(userPicture) {
        response.success(userPicture);
    }
});

Wie dem auch sei, scheint es, wenn Sie viele Bilder haben, die sich auf einen Benutzer beziehen, Sie wahrscheinlich nach Parser-Beziehungen statt nach Zeigern suchen: https://www.parse.com/docs/relations_guide

26
Murilo

Wenn Sie eine Abfrage schreiben, um ein übergeordnetes Objekt und ein untergeordnetes Objekt abzurufen, auf das Sie einen Zeiger haben, jedoch keinen Lesezugriff gemäß der ACL haben, gibt die Abfrage möglicherweise nur das übergeordnete Objekt zurück, und das untergeordnete Objekt ist null, da die ACL es nicht zulässt.

0
Abdul Vajid

Möglicherweise liegt ein Problem mit Ihren Params vor. Wenn "Benutzer" ein Zeiger ist, ist "request.params.user" falsch, da PFObjects möglicherweise nicht als Parameter gesendet werden. Wenn "Benutzer" ein Zeiger ist, verwenden Sie "request.user". Wenn request.params.user eine Zeichenfolge der userId ist, können Sie die ID verwenden, um eine PFObject-Shell vor der Abfrage zu rekonstruieren, wie dies bereits von Murilo vorgeschlagen wurde. Das Löschen des Parameters "user" und die Verwendung von request.user würden jedoch den Code und keine Werte duplizieren. Die Lösung von Murilo ist auch von Vorteil, weil Sie eine andere Benutzer-ID als die aktuelle Benutzer-ID übergeben können. 

0
Troup