通过CompositeFilterOperator在键列表子集中查找GAE数据存储区实体

时间:2013-07-09 09:46:12

标签: google-app-engine google-cloud-datastore

我有两个依赖类:让我们说

  • 产品
  • 该产品上每个用户的最终收藏标志(许多用户可以将产品标记为收藏)

当我需要在用户喜欢的产品子集中执行过滤时,我发现自己有一个问题:没有API

例如:我想搜索用户1最喜欢的产品,标签为'sport'且颜色为'blue'的产品

我可以

  • 对标签和颜色标准执行CompositeFilter,然后迭代所有产品(数千)以找到最喜欢的id列表中的哪些产品!哇! : - )
  • 找到收藏夹的子集,并手动执行所有其他条件过滤(以编程方式,保留数据存储区API)。 YESSSS !!!
  • 最后但并非最不重要:在产品本身(收藏列)中添加收藏用户ID列表,以便每次用户将产品放入收藏夹时,所有120个索引写入都会被重写。 COOOOL !!!

好的,我在作弊,有一个解决方案:我可以阅读收藏的实体,然后在查询中使用带有巨大(id = x1或id = x2或......)的产品的ID存在风险发现自己超出了查询大小的限制。因此,我应该通过两个实体处理分页和间接光标,以获得非常简单的读取...

Soooo是啊......想法?

最诚挚的问候, 齐德哈姆迪 http://1vu.fr

1 个答案:

答案 0 :(得分:1)

您可以合并keyproperty filters。如果我理解上面的数据,查询将是:

Query q =  new Query("Product");

// favourite product key filter (max 30 in listOfProductIDs because this is IN query)
query.addFilter(Entity.KEY_RESERVED_PROPERTY,
                        Query.FilterOperator.IN, listOfProductIDs);

// add the property filters
query.addFilter("color", Query.FilterOperator.EQUAL, "blue");
query.addFilter("tag", Query.FilterOperator.EQUAL, "sport");