2014-03-14 38 views
0

我有两个解析表POST和COMMENT。 我想获得所有帖子,有新的评论。我正在根据post table中的viewingDate字段和Comment Table中的createdAt字段进行检查。JOIN TABLES parse.com

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) { 

    }]; 

}]; 

UPDATE * 这是我要做的事目前 *

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; 

      } 
     }]; 

    } 
}]; 

更新2与关系

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

什么是p.viewedDate?上次该帖子是由任何用户查看的?你能解释这个领域背后的推理吗? – Moonwalkr

+0

是的,上次帖子的作者查看后。 –

回答

1

你的问题是不是真的缺乏在解析上连接表查询,而是你用SQL思维设计你的数据库而不是NoSQL的思维模式(当然这对所有来自关系数据库世界的人来说都是常见的)。

当为解析(或任何其他NoSQL数据库)设计数据库“模式”时,您需要将自己从关系和规范化等问题中解放出来,思考数据访问。你将如何访问你的数据?首先考虑如何查询数据,然后设计数据库以优化这些查询。对于您的移动应用程序最重要的是尽量减少连接到远程服务器的数量,并尽量减少客户端处理。

有几种方法可以解决您当前的问题。当然,您可以创建一些查询来解决缺少连接表查询的问题,并在客户端处理一些查询。如果此功能需要快速实施,那么短期内可能会发挥作用。

长期的做法是重新设计您的模式以满足您轻松检索具有新评论的帖子的要求。

一个解决方案(几个可能的):

创建Post类一个新的属性:“newcomments”这是一个布尔值。

创建一个云代码片段,在创建新评论(将其设置为TRUE)时更新Post中的newcomments属性。 (https://parse.com/docs/cloud_code_guide#functions-aftersave

然后,无论何时您打开帖子查看新评论,您都会在后台将此字段重置为FALSE。 现在,你可以查询,其中newcomments equalTo假

或者,而不是newcomments是一个布尔帖子,你也可以同样用它来存储指针数组实际新的注释(afterSave钩更新此数组指向新评论的指针)。这样,一旦打开帖子,您就不需要第二次查询就能获得新评论。在这里,您在阅读注释后立即清除newcomments属性(或者打开帖子并获得注释数组)。

这种数组的存储可能会在你的SQL思维方式中引起不好的注意,但这是SQL和NoSQL之间的许多区别之一,因为后者比存储和一致性更关注查询效率。或者,如果您不希望将其存储在Post对象中,则可以创建一个新的PostTracker(或其他)类来处理此问题。也许还有其他的事情要跟踪(当然,即使你目前还没有这方面的想法,未来也可能会有这种情况)。

+0

谢谢你......但是有没有解决方案,我目前的情况 –

+0

不,我不认为有任何体面的解决方案。我能想到的所有解决方案都涉及很多查询和/或客户端处理。问题是截止日期是未知的,并且对于每个帖子都是不同的。如果没有连接表,您必须首先获取viewingDate,然后获取每条帖子的评论。我没有看到一个不涉及大量查询的可行解决方案。我建议你创建一个云代码,扫描所有当前在后台的数据,以准备我建议的解决方案之一。 – Moonwalkr