8

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

在这里ClassTeamStudent被建模为一对多关系。

现在,当学生使用他或她自己的用户帐户注册课程时,相应Student的 'user列将设置为当前用户。

然后我想列出creator其学生列(如果存在)之一的 ORuser等于的所有类currentUser

如何在 Parse 中创建这样一个引用多个类的查询(或者如何优化数据库以便可以尽可能高效地进行这样的查询——而不必创建两个单独的查询?)

任何帮助表示赞赏。

澄清:

我知道我可以按照 Parse 文档中的描述进行 or 查询(我应该在问题中说明这一点),但是,我的问题是关于在关系数据上这样做(由指向父级的指针类型属性定义)。在这里,我需要 user 是 Student 实例的属性,该属性属于 Team,然后属于 Class,我只想过滤具有 creator 属性或其孙子(学生的实例)用户之一的 Class 对象属性等于 currentUser,有效地仅列出您创建或注册为学生的课程。

4

2 回答 2

1

由于当前的数据库模式具有嵌套的指针,因此如果不对其进行调整,就没有简单的方法来实现这一点。


数据库模式

Class类中,添加一个RelationorArray字段以包含对Student/User对象的引用。如果User用作对象指针,我们一开始就不需要查找Student

询问

我假设你在课堂上有studentsArray的领域。包含对象。ClassstudentsUser

  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
  });
于 2015-11-06T03:17:28.697 回答
1

好的,您想在带有内部子查询的 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.
    }
});
于 2015-11-04T19:09:41.030 回答