首页 > 解决方案 > GAE 数据存储复合过滤器不起作用

问题描述

我正在构建一个复合过滤器,当我为此查询设置排序顺序时,它有 OR 和 AND 过滤器运算符,它没有给出正确的结果。

我尝试执行的查询是 { status == Initiated OR (Status == Failed AND failedCount <= 5) }。它实际上执行查询没有任何错误,但结果并不完全正确。它只检索“status == failed AND failedCount <= 5”而不是 status == 启动。我需要的顺序是“createdAt”字段。

Filter initiatedFilter = new FilterPredicate("status", FilterOperator.EQUAL, "Initiated");

Filter failedFilter = new FilterPredicate("status", FilterOperator.EQUAL, "Failed");

Filter failedCountFilter = new FilterPredicate("failedCount", FilterOperator.LESS_THAN_OR_EQUAL, 5);

CompositeFilter failedCompositeFilter = CompositeFilterOperator.and(failedFilter, failedCountFilter);

CompositeFilter initaiedFailedFilter = CompositeFilterOperator.or(initiatedFilter, failedCompositeFilter);

Query query2 = new Query("JobInstance").setFilter(initaiedFailedFilter).addSort("failedCount", SortDirection.ASCENDING).addSort("createdAt", SortDirection.ASCENDING);

jobEntitesList = datastoreService.prepare(query2).asList(FetchOptions.Builder.withLimit(limit));

for (Entity jobEntity2 : jobEntitesList) {
    /* doing some task */
}

我观察到的是,如果删除 addSort() 它工作正常。但对我来说排序很重要。我希望结果应该是“createdAt”顺序。如果我删除 failedCount 那么它会引发一些错误。

标签: google-cloud-datastore

解决方案


或者过滤器完全在客户端中实现(如 IN 查询过滤器:https ://cloud.google.com/appengine/docs/standard/java/datastore/queries#filters )。所以你的排序发生在客户端。在status == Failed AND FailedCount <= 5status == Initiated.

从您的评论中,尚不清楚您要查找的排序顺序。如查询限制中所述,主排序顺序必须在 failedCount 上,因为它具有不等式过滤器。


推荐阅读