AppEngine 数据存储区查询具有给定属性的所有实体 (Java)

Posted

技术标签:

【中文标题】AppEngine 数据存储区查询具有给定属性的所有实体 (Java)【英文标题】:AppEngine datastore query for all entities that have a given property (Java) 【发布时间】:2014-03-05 13:52:19 【问题描述】:

我正在尝试找出一种优雅的方式来查询 AppEngine 数据存储中具有特定属性的所有实体。由于缺少属性的实体不包含在索引中,基本上我想要做的是检索给定属性的索引。我确信可以执行以下操作:

Filter bigger = new FilterPredicate(PROPERTY,
                  FilterOperator.GREATER_THAN_OR_EQUAL,
                  0);

Filter smaller = new FilterPredicate(PROPERTY,
                  FilterOperator.LESS_THAN_OR_EQUAL,
                  0);

Filter present = CompositeFilterOperator.or(bigger, smaller);

Query q = new Query(KIND).setFilter(present);

但它看起来不是一个非常优雅(或高效)的解决方案。有人有更好的主意吗?

【问题讨论】:

【参考方案1】:

如果你不需要具有空值的实体,你可以使用这个:

Filter filter = new FilterPredicate(PROPERTY, FilterOperator.NOT_EQUAL, null);

它可能看起来更简单,但 NOT_EQUAL 过滤器实际上会产生两个单独的查询 - 就像您的解决方案一样,除非 App Engine 对空值很聪明 - 我不知道。

【讨论】:

【参考方案2】:

我感兴趣的属性实际上是一个可能有很多值的列表,所以我决定不对其进行索引,并添加一个单独的布尔属性 HAS_LIST。这允许我以稍大的实体为代价对结果进行一次查询。仍然不是一个非常优雅的解决方案,但也许效率更高。

【讨论】:

以上是关于AppEngine 数据存储区查询具有给定属性的所有实体 (Java)的主要内容,如果未能解决你的问题,请参考以下文章

AppEngine 数据存储区异步放置

超出 Appengine 数据存储区读取操作限制

从数据存储区查询大量 ndb 实体的最佳实践

App Engine:如何“重置”数据存储区?

AppEngine数据存储 - 以编程方式备份

具有限制的数据存储区查询