如何在 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
    }
});

此处 ClassTeamStudent 被建模为 one-to-many 关系。

现在,当学生使用自己的用户帐户注册 class 时,相应的 Studentuser 列将设置为当前用户。

然后我想列出所有 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 中,添加 RelationArray 字段以包含对 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
  });