Как запросить реляционные данные в Parse JavaScript

Я совсем новичок в разборе.

У меня есть база данных, настроенная с использованием этого кода:

var Class = Parse.Object.extend("Class");
var Team = Parse.Object.extend("Team");
var Student = Parse.Object.extend("Student");

var newClass = new Class();
newClass.set("name", className);
newClass.set("code", classCode);
newClass.set("creator", currentUser);
var classACL = new Parse.ACL(currentUser);
classACL.setPublicReadAccess(true);
newClass.setACL(classACL);

newClass.save();

for (var i = 0; i < teamNames.length; i++) {
    var team = new Team();
    team.set("name", teamNames[i]);
    var teamACL = new Parse.ACL(currentUser);
    teamACL.setPublicReadAccess(true);
    team.setACL(teamACL);

    team.save();

    for (var j = 0; j < studentNames[i].length; j++) {
        if (studentNames[i][j]) {
            var student = new Student();
            student.set("name", studentNames[i][j]);

            student.set("parent", team);

            student.save();
        }
    }

    team.set("parent", newClass);

    team.save();
}

newClass.save(null, {
    success: function(newClass) {
        //success
    },
    error: function(newClass, error) {
        //fail
    }
});

Вот Class, Team, а также Student моделируются как отношения один ко многим.

Теперь, когда ученик записывается в класс, используя свою учетную запись, соответствующий Student"s user столбец установлен для текущего пользователя.

Затем я хочу перечислить все классы, чьи creator ИЛИ один из его учеников user столбец (если существует) равен currentUser,

Как мне создать такой запрос, ссылающийся на несколько классов в Parse (или как я могу оптимизировать базу данных, чтобы такой запрос мог быть сделан максимально эффективным - без необходимости создавать два отдельных запроса?)

Любая помощь приветствуется.

Разъяснение:

Я знал, что могу выполнить запрос или запрос, как описано в документации Parse (я должен был указать это в вопросе), однако, мой вопрос заключается в том, чтобы сделать это для реляционных данных (определяемых свойством типа указателя на parent). Здесь мне нужно, чтобы user был свойством экземпляра Student, принадлежащего Team, а затем Class, и я хотел бы отфильтровать только объекты Class, у которых есть либо свойство создателя, либо один из его внуков (экземпляр Student). свойство, равное currentUser, фактически перечисляет только те классы, которые вы создали или зарегистрировали в качестве студента.

2 ответа

Решение

Поскольку текущая схема базы данных имеет вложенные указатели, нет простого способа добиться этого без ее корректировки.


Схема базы данных

В Class класс, добавить Relation или же Array поле для хранения ссылок на Student/User объекты. Если вы используете User как указатель объекта, нам не нужно искать Student вначале.

запрос

Я предполагаю, что у вас есть students как новый Array поле в Class учебный класс. students содержит User объекты.

  var user = Parse.User.current();
  var studentQuery = new Parse.Query(Class);
  var creatorQuery = new Parse.Query(Class);

  studentQuery.equalTo("students", user);
  creatorQuery.equalTo("creator", user);
  var query = Parse.Query.or(studentQuery, creatorQuery);
  query.find().then(function(objects){
      // Proceed with the results
  },function(error){
      // Handle error
  });

Хорошо, что вы хотите сделать в запросе OR с внутренним подзапросом. Один вызов для анализа, и вы можете отфильтровать свойства ученика, используя подзапрос.

var studentQuery = new Parse.Query(Student);
studentQuery.equalTo("user", Parse.User.current());

var firstQuery = new Parse.Query(Class);
firstQuery.matchesQuery("student", studentQuery);

var secondQuery = new Parse.Query(Class);
secondQuery.equalTo("creator", Parse.User.current());

var mainQuery = Parse.Query.or(firstQuery, secondQuery);
mainQuery.find({
    success: function(results) {
        // results contains a list of Classes where the user is either the creator or the user property of the student (if available)
    },
    error: function(error) {
        // There was an error.
    }
});
Другие вопросы по тегам