doesNotMatchKey:inQuery:返回与Parse SDK for iOS中的键匹配的logging

我正在尝试使用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) 

任何帮助将非常感激!

谢谢,Tim

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

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

productLikes是产品ID的数组。

另一个解决scheme是将产品喜欢的存储在一个不同的表中,但是仍然是一个数组(不是单独的logging,而是指向产品和用户的指针,如SQL数据库)。 在这种情况下,您可以像您在问题中一样嵌套查询。