【问题标题】:GAE datastore composite filter not workingGAE 数据存储复合过滤器不起作用
【发布时间】:2019-09-30 07:31:37
【问题描述】:

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

我尝试执行的查询是 { status == Initiated OR (Status == Failed AND failedCount

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


    【解决方案1】:

    或者过滤器完全在客户端实现(如 IN 查询过滤器:https://cloud.google.com/appengine/docs/standard/java/datastore/queries#filters)。所以你的排序发生在客户端。在从 status == Initiated 获取任何结果之前,您可能会从 status == Failed AND FailedCount <= 5 查询中获取所有结果。

    根据您的评论,不清楚您要查找的排序顺序。正如Restrictions on queries 中所述,主排序顺序必须在 failedCount 上,因为它有一个不等式过滤器。

    【讨论】:

    • 谢谢你,吉姆。因为查询具有不等式过滤器,所以我必须使用“failedCount”作为主要排序,然后另一个排序是“createdAt”。你可以在代码部分看到。我有什么疑问,如果我删除这两种排序,它会在没有排序的情况下给出正确的结果,但对我来说,排序是必需的。为什么两种行为我不清楚?如果我使用 IN 运算符,这可以给出正确的结果吗?
    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多