我有两个解析表POST和COMMENT。 我希望得到所有有新评论的帖子。我根据post表中的ViewedDate字段和Comment Table中的createdAt字段进行检查。
SELECT *
FROM POST p
INNER JOIN COMMENT c
ON p.objectId==c.pId and c.createdAt > p.viewedDate;
PFQuery *post = [ParsePost query];
[post findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
PFQuery *post = [ParsePost query];
PFQuery *comment = [ParseComment query];
//how add greater than for keys from other table?
//line below crashes
[comment whereKey:@"createdAt" greaterThan:[objects valueForKey:@"viewedDate"]];
[comment whereKey:@"post" matchesKey:@"objectId" inQuery:post];
[post whereKey:@"objectId" matchesKey:@"post" inQuery:comment];
[post findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
}];
}];
更新 * 这就是我目前的工作方式 *
PFQuery *postView = [ParsePost query];
[postView whereKey:@"author" equalTo:[ParseLigoUser currentUser]];
[postView findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
for (ParsePost *post in objects) {
PFQuery *comment = [ParseComment query];
[comment orderByDescending:@"createdAt"];
if (post.viewedDate) {
[comment whereKey:@"createdAt" greaterThan:post.viewedDate];
}else {
continue;
}
[comment whereKey:@"post" equalTo:post];
[comment countObjectsInBackgroundWithBlock:^(int number, NSError *error) {
if (number>0) {
if (!self.newposts) {
self.newposts = [NSMutableDictionary dictionary];
}
[self.newposts setObject:@"NOTSEEN" forKey:[post.objectId stringByAppendingString:@"Comment"]];
self.postCount += 1;
}
}];
}
}];
UPDATE 2 with relations
PFQuery *postView = [ParsePost query];
[postView whereKey:@"author" equalTo:[ParseLigoUser currentUser]];
[postView setLimit:100];
[postView findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
for (ParsePost *post in objects) {
PFRelation *rel = [post relationForKey:@"hasComment"];
PFQuery *query = [rel query];
[query orderByDescending:@"createdAt"];
if (post.viewedDate) {
[query whereKey:@"createdAt" greaterThan:post.viewedDate];
}else {
continue;
}
[[rel query] countObjectsInBackgroundWithBlock:^(int number, NSError *error) {
if (number>0) {
if (!self.newposts) {
self.newposts = [NSMutableDictionary dictionary];
}
[self.newposts setObject:@"NOTSEEN" forKey:[post.objectId stringByAppendingString:@"Comment"]];
self.postCount += 1;
}
}];
}
}];
答案 0 :(得分:1)
您的问题实际上并不是解析时缺少连接表查询,而是您使用sql思维模式设计数据库而不是NoSQL思维模式(当然这对于来自关系数据库世界的所有人来说都很常见)
在为解析(或任何其他NoSQL数据库)设计数据库“schema”时,您需要摆脱思考关系和规范化等问题来思考数据访问。您将如何访问您的数据?首先考虑如何查询数据,然后设计数据库以针对这些查询进行优化。对您的移动应用程序而言,最重要的是最大限度地减少与远程服务器的连接数量,并最大限度地减少客户端处理。
有几种方法可以解决当前问题。当然,您可以创建一些可以解决缺少连接表查询的查询,并在客户端上处理其中的一些问题。如果需要快速实施此功能,那么这可能是短期的。
长期方法是重新设计您的架构,以满足您轻松检索具有新评论的帖子的要求。
一种解决方案(有几种可能):
在Post类中创建一个新属性:“newcomments”是一个布尔值。
创建一个云代码片段,只要创建新评论,就会在Post中更新newcomments属性(将其设置为TRUE)。 该片段应该在用于Comment(https://parse.com/docs/cloud_code_guide#functions-aftersave)
的afterSave挂钩中运行然后,每当您打开帖子以查看新评论时,您都会在后台将此字段重置为FALSE。 现在,您可以查询newcomments equalTo false
的帖子或者,不是newcomments是布尔值,你也可以使用它来存储指向实际新注释的指针数组(afterSave钩子用指向新注释的指针更新这个数组)。这样,一旦打开帖子,您就不需要第二个查询来获取新评论。在这里,您在阅读完评论后立即清除newcomments属性(或打开帖子并获得一系列评论)。
这种数组的存储可能在你的SQL思维模式中引起了不好的注意,但这是SQL和NoSQL之间的许多差异之一,因为后者更关注查询效率而不是存储和一致性。
或者,如果您不想将其存储在Post对象中,您可以创建一个新的PostTracker(或其他)类来处理它。也许还有其他你想跟踪的东西(当然,未来可能还会有,即使你现在还没有想到这一点)。