加入表parse.com

时间:2014-03-14 05:27:05

标签: ios parse-platform

我有两个解析表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;
            }
        }];
    }
}];

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(或其他)类来处理它。也许还有其他你想跟踪的东西(当然,未来可能还会有,即使你现在还没有想到这一点)。