是否可以允许用户过滤他想要的所有数据?

时间:2014-12-29 16:05:50

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

我使用数据存储区是全新的,我对过滤器有疑问。

这是我在java-objectify中定义的实体:

@Entity
public class Element {


    @Id
    private long id;

    @Index
    private String item1;

    @Index
    private Integer item2;

    //(...) 3-39 items

    @Index
    private String item40;


}

我希望用户能够使用任何类型的过滤器组合过滤此“实体”的“种类”。

例如:

query = query.filter("item1 =", "Tokyo").filter("item25 <", 10).filter("item3 >" , 0);

要使用此过滤器,我需要创建索引,如下所示:

<datastore-index kind="Conference" ancestor="false"
    source="auto">
    <property name="item1" direction="asc" />
    <property name="item25" direction="asc" />
    <property name="item3" direction="asc" />       
</datastore-index>

因此,要允许包含40个项目的所有过滤器组合,必须创建一个 非常多的索引

我的问题是:

Google DataStore是否专为这些类型的查询而设计?

还有其他方法让用户在过滤器中自由吗?

1 个答案:

答案 0 :(得分:2)

不像你想的那样,由于zigzag merge join algorithm,灵活的过滤是可能的,但是只包括相等过滤器,对于不等式和排序你需要复合索引(上限为200) ,甚至是inequality filters are limited to at most one property

所以最终不能正确使用这种数据库,你可以做的是想到更多面向任务的搜索过滤器(比如第一篇文章的例子,这是必读的),或设计你的查询围绕限制的界面,只提供相等过滤器,单一属性排序(因为每个属性都需要一个新的复合索引而你不想用完),只有一个空间用于不等式(只需要完全理解第二条中列出的限制)。