客体化中的复杂查询

时间:2014-11-28 10:54:59

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

考虑更复杂的实体结构,如

class Entity {
    Float valueA;
    Float valueB;
    List<Property> properties;
}

class Property {
    Long id;
    Float value;
}

我现在正试图找出一个像(Pseudo sql)这样的查询的索引结构:

select entity where valueA >= x and valueB < y and properties contains
((id = a, value >= b) and (id = c, value = d))

我面临的问题是:

  • 我无法将多个不等式过滤器放在一个查询中。
  • 如何为列表属性对象添加约束

到目前为止,我有一个想法出现在我脑海中:

我可以使用所有属性的关系索引模式。例如。创建以下实体:

class ValueA/ValueB {
   @Parent
   Key<Entity> parent;
   @Id
   Long id = 1L;
   @Index
   Float minValue;
}

并更改Property类,如

class Property {
    @Parent
    Key<Entity> parent;
    @Id
    Long id;
    @Index
    Float value;
}

然后我可以对每个相关的索引类进行查询,并保留那些符合所有标准的实体的父键。

这样做很难有效,而且很容易变得非常昂贵。

我可以尝试其他任何解决方案吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

我会在搜索Api中存储我的实体的非规范化副本,这样可以进行更灵活的查询。

确保搜索Api的结果包含实体的ID。

最后,使用Objectify执行keys()查询以获取结果的实际实体。