如何在Parse JavaScript中查询关系数据

时间:2015-11-01 07:51:13

标签: javascript parse-platform parse-javascript-sdk

我对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或其学生user列之一(如果存在)等于currentUser的所有课程。

如何在Parse中创建引用多个类的此类查询(或者如何优化数据库以使这样的查询尽可能高效 - 而无需创建两个单独的查询?)

感谢任何帮助。

澄清:

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

2 个答案:

答案 0 :(得分: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.
    }
});

答案 1 :(得分:1)

由于当前数据库模式具有嵌套指针,因此没有简单的方法可以在不进行调整的情况下实现此目的。

数据库架构

Class课程中,添加RelationArray字段以包含对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
  });