我有一个Posts
个对象。用户通过创建具有指向攻击性Flags
对象的指针的Posts
对象来标记帖子。如何查询尚未标记的Posts
?我试过了:
var postQuery = new Parse.Query("Posts");
var flagQuery = new Parse.Query("Flags");
postQuery.doesNotMatchKeyInQuery("objectId", "post", flagQuery);
但不会省略标记的帖子(objectId
是字符串,post
是指针?)。
其他想法(以及我拒绝它们的原因):
flagQuery
,创建标记的帖子ID数组,并使用postQuery.notContainedIn("objectId", flagArray);
(这需要额外的请求)Posts
对象上增加已标记的计数器(这不会让我调查哪些用户标记了什么)Posts
对象中存储一组旗手(用户),而不是拥有Flags
对象(这不会让我调查时间戳)答案 0 :(得分:1)
此用例与我回答的here类似。
如果您还需要能够跟踪标记的时间戳,只需稍微更改模型,以便在Post中存储Flag对象数组。然后,您可以向查询添加约束,以仅获取没有Flag对象的帖子:query.whereKeyDoesNotExist("flags")
从技术上讲,我会通过为Flag对象添加一个云代码afterSave()
函数来解决这个问题,该函数通过向flags
数组列添加指向新创建的Flag对象的指针来更新Post对象。
评论后修改:
OP已经明确指出,只有帖子没有被他感兴趣的当前用户标记。由于查询效率是你想要优化的,我会通过复制数据来处理这个问题。保留数组列的标志,并为 flaggedby 添加另一个数组列。然后afterSave()
将添加指向Flag对象的指针和指向User对象的指针。
请记住,如果用户“取消标记”帖子,则要求您同时更新这两列...
要查找当前用户未标记的帖子,请查询 flaggedby 数组,如下所示:
[query whereKey:@"flaggedby" notEqualTo:[PFUser currentUser]];
这将返回当前用户未包含在 flaggedby 数组列中的所有帖子