如何在 Parse 中查询关系数据 JavaScript
How to query relational data in Parse JavaScript
我对 Parse 很陌生。
我使用此代码设置了一个数据库:
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
被建模为 one-to-many 关系。
现在,当学生使用自己的用户帐户注册 class 时,相应的 Student
的 user
列将设置为当前用户。
然后我想列出所有 class 的 creator
或其中一个学生的 user
列(如果存在)等于 currentUser
.
如何在 Parse 中创建这样一个引用多个 classes 的查询(或者我如何优化数据库以使这样的查询尽可能高效——而不必创建两个单独的查询查询?)
感谢任何帮助。
澄清:
我知道我可以按照 Parse 文档中的描述执行 or 查询(我应该在问题中说明这一点),但是,我的问题是关于关系数据(由指针类型定义 属性 到 parent)。在这里我需要用户是 Student 实例的 属性,它属于 Team,然后是 Class,我只想过滤 Class objects 有它的创建者 属性 或其孙子(Student 的一个实例)之一的用户 属性 等于 currentUser,有效地仅列出您创建或注册为学生的 classes。
好的,您想在带有内部子查询的 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.
}
});
由于当前的数据库模式有嵌套指针,如果不调整它,就没有简单的方法来实现这一点。
数据库架构
在 Class
class 中,添加 Relation
或 Array
字段以包含对 Student
/User
对象的引用。如果你使用 User
作为对象指针,我们一开始就不需要查找 Student
。
查询
我假设您在 Class
class 中有 students
作为新的 Array
字段。 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
});
我对 Parse 很陌生。
我使用此代码设置了一个数据库:
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
被建模为 one-to-many 关系。
现在,当学生使用自己的用户帐户注册 class 时,相应的 Student
的 user
列将设置为当前用户。
然后我想列出所有 class 的 creator
或其中一个学生的 user
列(如果存在)等于 currentUser
.
如何在 Parse 中创建这样一个引用多个 classes 的查询(或者我如何优化数据库以使这样的查询尽可能高效——而不必创建两个单独的查询查询?)
感谢任何帮助。
澄清:
我知道我可以按照 Parse 文档中的描述执行 or 查询(我应该在问题中说明这一点),但是,我的问题是关于关系数据(由指针类型定义 属性 到 parent)。在这里我需要用户是 Student 实例的 属性,它属于 Team,然后是 Class,我只想过滤 Class objects 有它的创建者 属性 或其孙子(Student 的一个实例)之一的用户 属性 等于 currentUser,有效地仅列出您创建或注册为学生的 classes。
好的,您想在带有内部子查询的 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.
}
});
由于当前的数据库模式有嵌套指针,如果不调整它,就没有简单的方法来实现这一点。
数据库架构
在 Class
class 中,添加 Relation
或 Array
字段以包含对 Student
/User
对象的引用。如果你使用 User
作为对象指针,我们一开始就不需要查找 Student
。
查询
我假设您在 Class
class 中有 students
作为新的 Array
字段。 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
});