Как запросить реляционные данные в 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.
}
});