Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parse.com: Find all objects belonging to a user with objectId

I have a Class in parse, say Pictures. Each of these belongs to a user. Reference to this user is stored in the Pictures table/class as a Pointer to the user.

In my cloud code I am trying to get all Pictures belonging to a user, using master key. Following is my 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);
    }
  });
});

This code outputs that there are 0 pictures for a certain user with id 'xyz' for example. However, I can see that the user has a lot of pictures stored.

I have also verified that the problem is not with using master key, as I see in the console log that the code is being executed as master. Moreover, if I query for a picture by objectId, it does come out in the results, which means ACL is not the problem here.

I think I have to use relations/joining here, but I am not sure how to do that.

like image 562
zzlalani Avatar asked Jan 02 '14 10:01

zzlalani


1 Answers

Pointers are stored as objects in Parse database, so if you try to compare a string to an object with query.equalTo() function, nothing will be found. This is how pointers are stored:

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

If you are querying a class with pointers and want your result comes with the whole object nested, you should set this in your query:

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

In my queries when I want to search by a pointer column, I compare my user object with the nested user object.

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);
    }
});

Anyway, seems that if you have many pictures related to an user, you probably are searching for parse relations instead of pointers: https://www.parse.com/docs/relations_guide

like image 89
Murilo Avatar answered Oct 04 '22 12:10

Murilo