我有一个解析中的类,比如图片。这些中的每一个都属于用户。对此用户的引用作为Pointer
存储在Pictures表/类中。
在我的云代码中,我试图使用主密钥将所有图片归属于用户。以下是我的代码:
Parse.Cloud.define("getPictures", function(request, response) {
Parse.Cloud.useMasterKey();
var query = new Parse.Query("Pictures");
query.equalTo("user", request.params.user);
query.find({
success: function(results) {
var status = "Found " + results.length + " pictures for userId " + request.params.user;
response.success(status);
},
error: function() {
status = "No pictures exist for userId " + request.params.user;
response.error(status);
}
});
});
此代码输出对于具有id“xyz”的特定用户,有0张图片。但是,我可以看到用户存储了大量图片。
我还验证了问题不在于使用主密钥,因为我在控制台日志中看到代码正在作为主代码执行。此外,如果我通过objectId
查询图片,它会在结果中出现,这意味着ACL不是问题。
我想我必须在这里使用关系/加入,但我不知道该怎么做。
答案 0 :(得分:26)
指针在Parse数据库中存储为对象,因此如果您尝试将字符串与具有query.equalTo()
函数的对象进行比较,则不会发现任何内容。这就是指针的存储方式:
{
__type: 'Pointer',
className: '_User',
objectId: user-object-id
}
如果您使用指针查询某个类并且希望您的结果是嵌套的整个对象,那么您应该在查询中设置它:
var query = new Parse.Query('Pictures');
query.include('user');
在我的查询中,当我想通过指针列进行搜索时,我将我的用户对象与嵌套的用户对象进行比较。
var user = new Parse.User();
// Set your id to desired user object id
user.id = your-user-id;
var query = new Parse.Query('Pictures');
// This include will make your query resut comes with the full object
// instead of just a pointer
query.include('user');
// Now you'll compare your local object to database objects
query.equalTo('user', user);
query.find({
success: function(userPicture) {
response.success(userPicture);
}
});
无论如何,似乎如果您有许多与用户相关的图片,您可能正在搜索解析关系而不是指针:https://www.parse.com/docs/relations_guide
答案 1 :(得分:0)
如果你编写一个查询来检索父对象和你有指针的子对象,但是没有按照ACL的读访问权限,那么查询可能只返回父对象,而子将为null,因为ACL不会让你读它。
答案 2 :(得分:0)
您的参数可能存在问题。如果“user”是一个指针,那么'request.params.user'是不正确的,因为PFObjects可能不会被发送为params。如果“user”是指针,请使用“request.user”。如果request.params.user是userId的字符串,您可以使用Id在查询之前重建PFObject shell,正如Murilo已经建议的那样,但删除“user”参数并使用request.user会缩短您的代码和不重复任何值。 Murilo的解决方案也很有用,因为您可以传递除当前用户ID之外的userId。