查找不在关系中的对象

时间:2014-12-08 09:15:48

标签: parse-platform

我在Parse中有一个自定义对象Team,其中包含默认User对象的关系字段。我想要做的是检索与任何User对象无关的所有Team个对象。任何人都可以指出我使用JavaScript SDK如何做到这一点的正确方向?我一直在查看Query object的文档,但我找不到任何内容。

也许另一种关系,或将关系放在另一个地方是一个更好的解决方案。我想要完成的是:每个用户只能在一个团队和一个团队中。此外,我需要能够从Parse查询以下信息:

  • 我想检索分配给团队的所有用户的User个对象
  • 我想检索未分配给任何团队的所有用户的User个对象

我尝试使用包含用户和团队对象ID的连接表。然后我尝试按照查询来获取未分配给团队的所有用户:

var teammember = Parse.Object.extend('TeamMember'),
    query = new Parse.Query("User");

var innerQuery = new Parse.Query("TeamMember");

query.doesNotMatchQuery('user', innerQuery);
query.find({
    success: function(results) {
        response.success(results);
    },
    error  : function(error) {
        response.error(error);
    }
})

但这只是给我以下回复:error: "{"code":102,"message":"bad type for $notInQuery"}"

我喜欢Relation类型,因为我可以通过一次调用REST API一次添加或删除多个成员。使用Relation类型将用户连接到团队时,我也可以检索团队成员的信息。它只是让没有分配给任何团队的用户给我带来问题。

2 个答案:

答案 0 :(得分:1)

听起来你根本不需要关系。而是向用户添加指向Team的指针列。它确保用户只能属于一个团队,并且可以按如下方式捕获您的其他要求。

// All users assigned to a team
query = new Parse.Query('User');
query.exists('team');

// All users assigned to a specific team
query = new Parse.Query('User');
query.equalTo('team', specificTeam);

// All unassigned users
query = new Parse.Query('User');
query.doesNotExist('team');

更新:如果您将来需要为每个用户支持多个团队,那么我建议创建一个名为Membership的Parse表,其中包含两列:指向用户的指针和指向团队的指针。这基本上比依赖Parse关系给你更多的控制,但它变得有点复杂。

_ = require('underscore'); // Or lodash

// All users assigned to a team
query = new Parse.Query('Membership');
query.find().then(function (results) {
    // http://underscorejs.org/#uniq
    users = _.uniq(results, false, function (user) { return user.id; });
});

// All users assigned to a specific team
query = new Parse.Query('Membership');
query.equalTo('team', specificTeam);

// All unassigned users
var assignedUsers = []
var unassignedUsers = []
memberQuery = new Parse.Query('Membership');
userQuery = new Parse.Query('User');

memberQuery.find().then(function (memberResults) {
    // http://underscorejs.org/#map
    var ids = _.map(memberResults, function (user) { return user.id; });
    // http://underscore.js.org/#uniq
    assignedUsers = _.uniq(ids);
    userQuery.find();
}).then(function (userResults) {
    var users = _.map(userResults, function (user) { return user.id; });
    // http://underscorejs.org/#difference
    unassignedUsers = _.difference(users, assignedUsers);
});

要在团队中添加和删除用户,您可以使用Parse.Object.saveAll()Parse.Object.destroyAll()创建成员资格对象并保存API调用。

答案 1 :(得分:1)

我遇到塞特提供的答案时遇到了麻烦。检索未分配给团队的用户时,两个阵列之间的差异将是不正确的。我假设这是因为assignedUsers类型为MembershipuserResults的对象属于User类型。这将使下划线无法进行正确的匹配。

我希望将其用作我的Cloud Code:

Parse.Cloud.define("getTeamlessUsers", function(request, response) {
    var _ = require("underscore"),
        assignedUsers = [],
        companyUsers = [],
        memberQuery = new Parse.Query("TeamMembers"),
        userQuery = new Parse.Query("User"),
        index,
        ubound;

    memberQuery.find().then(function(memberResults) {
        // Make sure each User ID will appear just once
        memberResults = _.unique(memberResults, false, function(item) { return item.get('user').id; });
        // Loop over the unique team members and push the User ID into the array
        for (index = 0, ubound = memberResults.length; index < ubound; index++) {
            var user = memberResults[index].get("user");
            assignedUsers.push(user.id);
        }
        // Get al the users
        return userQuery.find();
    }).then(function(userResults) {
        // Loop over all the users and push the ID into the array 
        for (index = 0, ubound = userResults.length; index < ubound; index++) {
            companyUsers.push(userResults[index].id);
        }
        // Create an array of user IDs which are not present in the assignedUsers array
        var result = _.difference(companyUsers, assignedUsers);
        // Return the IDs of user not assigned to any team
        response.success(result);
    }).fail(function(error) {
        response.error(error);
    });
});