Java objectify中的复杂查询

Java objectify中的复杂查询,java,google-app-engine,objectify,google-cloud-datastore,Java,Google App Engine,Objectify,Google Cloud Datastore,考虑一个更复杂的实体结构,如 class Entity { Float valueA; Float valueB; List<Property> properties; } class Property { Long id; Float value; } 类实体{ 浮动价值a; 浮动值b; 列出财产; } 类属性{ 长id; 浮动值; } 我现在正试图找出一个索引结构来执行以下查询(伪sql): 选择valueA>=x和valueB=b)

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

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

class Property {
    Long id;
    Float value;
}
类实体{
浮动价值a;
浮动值b;
列出财产;
}
类属性{
长id;
浮动值;
}
我现在正试图找出一个索引结构来执行以下查询(伪sql):

选择valueA>=x和valueB=b)和(id=c,值=d))
我面临的问题是:

  • 我不能在一个查询中放置多重不等式过滤器
  • 如何为列表属性对象添加约束
到目前为止,我脑海中闪过一个想法:

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

class ValueA/ValueB {
   @Parent
   Key<Entity> parent;
   @Id
   Long id = 1L;
   @Index
   Float minValue;
}
类值A/B{
@母公司
关键父母;
@身份证
长id=1L;
@索引
浮动最小值;
}
并将属性类更改为

class Property {
    @Parent
    Key<Entity> parent;
    @Id
    Long id;
    @Index
    Float value;
}
类属性{
@母公司
关键父母;
@身份证
长id;
@索引
浮动值;
}
然后我可以对每个相关的索引类进行查询,并保留那些符合所有条件的实体的父键

这将很难有效地完成,而且很容易变得非常昂贵

有没有其他的解决方案我可以试试


提前谢谢

我会在搜索Api中存储实体的非规范化副本,这允许更灵活的查询

确保来自搜索Api的结果包含实体的Id


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

对于类似这样的复杂查询,您最好对数据模型进行非规范化处理,或者对要筛选的属性进行非规范化处理。也就是说,它还取决于您正在查看的数据集和结果集的大小。例如,对于较小的结果集,也许您可以执行更简单的查询,然后在应用程序中执行进一步的筛选?好吧,应用程序内数据处理和数据库筛选之间的平衡并不是我问题的范围。但是假设数据集可能很大,我想做尽可能多的db过滤。我不太清楚如何以良好的方式对实体进行非规范化以适应上述问题。特别是如果有更多的列表属性,这绝对是一个值得花时间的想法!
class Property {
    @Parent
    Key<Entity> parent;
    @Id
    Long id;
    @Index
    Float value;
}