在对象中查询字段不为空的所有记录的有效方法

时间:2014-09-14 15:29:18

标签: google-app-engine objectify

我想有效地查询索引字段以检索索引字段不为空(存在于索引中)的所有记录。要查询的字段包含Ref<T>到另一个实体,如果这是相关的。

我能做的是不等式搜索,例如.filter/.filterKey("fieldname >=", "a"),其中a是我想要抓取的最小ASCII。

但这有效吗?或者我可以以某种方式进行相等搜索,它会返回索引中存在的所有记录吗?

-

这就是我的数据的样子:我想过滤“overlay”列有一个键的所有记录,并省略那些没有设置字段的记录。我想尽可能使用相等过滤器,所以我不需要复合索引(因为我在同一时间过滤其他字段)。

snapshot of data

-

我可以用它来测试!= null

.filter("user >", "\uFFFD");

这是为了测试== null

.filter("user <", "\uFFFD");

我想这不是它应该做的方式。有没有办法用平等而不是不平等来解决这个问题?

2 个答案:

答案 0 :(得分:7)

如果要查询索引字段为空值的实体:

ofy().load().type(Thing.class).filter("fieldname !=", null)

但是,这与相等过滤器不同。在封面下,GAE将!=视为一对过滤器(&gt;和&lt;),这带来了不等式过滤器的局限性。

如果需要对“not null”进行相等过滤,请在实体中创建一个合成索引字段,该字段使用@OnSave方法填充。您可以对'true'值使用部分索引来限制索引此额外数据的成本(即@Index(IfTrue.class)

答案 1 :(得分:0)

如果你的属性是String,那么比#34;!= null&#34;更有效。是用:

ofy().load().type(Thing.class).filter("fieldname >=", "");

同样,您可以使用&gt;如果您的财产是正数等,则为0