3

我正在尝试使用 Parse SDK 在 xcode 中做一个简单的查询,我在其中向用户展示产品,但我不想向他们展示他们已经“喜欢”的产品。

所以我在 Parse 中有两个正在使用的表:
- 产品:有一个 objectId
- 喜欢:包含列:喜欢(说是/否),指向产品的指针,指向用户的指针

我的任何代码是:

//query will get products that the user has liked
PFQuery *likeQuery = [PFQuery queryWithClassName:@"Likes"];
[likeQuery whereKey:@"User_Obj" equalTo:[PFUser currentUser]];

//product query will get products that are not in like query
PFQuery *prodQuery = [PFQuery queryWithClassName:@"Products"];
[prodQuery whereKey:@"objectID" doesNotMatchKey:@"Product" inQuery:likeQuery];

//restrict to 10 items
[prodQuery setLimit:10];
[prodQuery findObjectsInBackgroundWithTarget:self
                                 selector:@selector(getCallback:error:)];

但是,当我尝试运行该用户以前喜欢的项目时,将被退回。

如果我在 SQL 中执行此操作,我会编写如下内容:

SELECT product FROM product WHERE product NOT IN (SELECT product FROM likes WHERE useriD = currentUser AND like = yes)

任何帮助将非常感激!

谢谢,蒂姆

4

1 回答 1

1

使用 Parse 和其他 NoSQL 服务,您需要将自己从 SQL 思维模式中解放出来(使用规范化等)。NoSQL“模式”更关注查询效率,而不是存储和一致性。正如 Petro 建议的那样,您可以将所有喜欢的内容存储在用户表中的数组中。然后,您可以使用约束条件查询 Parse,即记录不应与查询中的任何 objectid 匹配,如下所示:

[query whereKey:@"objectId" notContainedIn:user.productLikes];

其中 productLikes 是产品 ID 数组。

另一种解决方案是将产品喜欢存储在不同的表中,但仍以数组的形式存储(不是每个喜欢的单独记录,带有指向产品和用户的指针,就像您使用 SQL 数据库所做的那样)。在这种情况下,您可以像在问题中那样嵌套查询。

于 2014-03-13T10:18:15.633 回答