我在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
类型将用户连接到团队时,我也可以检索团队成员的信息。它只是让没有分配给任何团队的用户给我带来问题。
答案 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
类型为Membership
且userResults
的对象属于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);
});
});