Parse.com: Найти все объекты, принадлежащие пользователю с помощью objectId

У меня есть класс в синтаксисе, скажем картинки. Каждый из них принадлежит пользователю. Ссылка на этого пользователя хранится в таблице/классе Pictures как Pointer пользователю.

В моем облачном коде я пытаюсь получить все Картинки, принадлежащие пользователю, используя мастер-ключ. Ниже приведен мой код:

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

Этот код выводит, что есть 0 изображений для определенного пользователя с id 'xyz', например. Тем не менее, я вижу, что у пользователя много сохраненных изображений.

Я также проверил, что проблема заключается не в использовании главного ключа, как я вижу в консольном журнале, что код выполняется как ведущий. Более того, если я запрашиваю изображение с помощью objectId, он выводится в результатах, что означает, что ACL здесь не проблема.

Я думаю, что мне нужно использовать отношения/присоединение сюда, но я не уверен, как это сделать.

Ответ 1

Указатели хранятся как объекты в базе данных Parse, поэтому, если вы попытаетесь сравнить строку с объектом с помощью функции query.equalTo(), ничего не будет найдено. Вот как сохраняются указатели:

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

Если вы запрашиваете класс с указателями и хотите, чтобы ваш результат пришел с вложенным объектом, вы должны установить это в своем запросе:

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

В моих запросах, когда я хочу искать по столбцу указателя, я сравниваю свой пользовательский объект с вложенным пользовательским объектом.

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

В любом случае, кажется, что если у вас много фотографий, связанных с пользователем, вы, вероятно, ищете отношения разбора вместо указателей: https://www.parse.com/docs/relations_guide

Ответ 2

Если вы пишете запрос для извлечения родительского объекта и дочернего объекта, к которому у вас есть указатель, но нет доступа для чтения в соответствии с ACL, тогда запрос может возвращать только родительский объект, а child будет пустым, поскольку ACL не позволит вам прочитайте его.

Ответ 3

Может возникнуть проблема с вашими параметрами. Если "пользователь" является указателем, то "request.params.user" неверен, поскольку PFObjects не могут быть отправлены в качестве параметров. Если "пользователь" является указателем, используйте "request.user". Если request.params.user является строкой userId, вы можете использовать Id для восстановления оболочки PFObject перед запросом, как уже было предложено Мурило, но удаление параметра "user" и использование request.user сократит ваш код и а не дублировать любые значения. Решение Murilo также полезно, потому что вы можете передать userId, кроме текущего идентификатора пользователя.