doesNotMatchKey:inQuery: 在 Parse SDK for iOS 中返回匹配键的记录

Posted

技术标签:

【中文标题】doesNotMatchKey:inQuery: 在 Parse SDK for iOS 中返回匹配键的记录【英文标题】:doesNotMatchKey:inQuery: return records that match key in Parse SDK for iOS 【发布时间】:2014-02-03 04:47:56 【问题描述】:

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

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

我的代码是:

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

任何帮助将不胜感激!

谢谢,蒂姆

【问题讨论】:

【参考方案1】:

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

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

productLikes 是产品 ID 数组。

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

【讨论】:

但是为什么给定的查询不起作用?如果不是这个, whereKey:doesNotMatchKey 实际上做了什么? 在他的具体例子中,我至少看到了两件事。对象 ID 的键应该是“objectId”,而不是“objectID”。其次,由于 Product 是一个指针,它应该根据 Product 的对象而不是 objectId 字符串来衡量。

以上是关于doesNotMatchKey:inQuery: 在 Parse SDK for iOS 中返回匹配键的记录的主要内容,如果未能解决你的问题,请参考以下文章