【问题标题】:GAE NDB Sorting a multiquery with cursorsGAE NDB 使用游标对多查询进行排序
【发布时间】:2016-07-28 10:47:20
【问题描述】:

在我的 GAE 应用程序中,我正在执行一个必须按日期排序的查询。查询必须包含一个 IN 过滤器,但这会导致以下错误:

BadArgumentError: _MultiQuery with cursors requires __key__ order

现在我已经阅读了其他 SO 问题 (like this one),建议更改为按键排序(错误也指出)。然而,问题是查询对于它的目的变得无用。它需要按日期排序。有什么建议的方法来实现这一目标?

【问题讨论】:

    标签: google-app-engine google-cloud-datastore google-cloud-platform app-engine-ndb


    【解决方案1】:

    Cloud Datastore 服务器不支持IN。 NDB 客户端库通过将带有 IN 的查询拆分为带有相等运算符的多个单个查询来有效地伪造此功能。然后它在客户端合并结果。

    由于同一实体可能会在 1 个或多个这些单个查询中返回,因此合并这些值在计算上变得很愚蠢*,除非您按 Key 排序**。

    相关,你应该阅读underlying caveats/limitations on cursors以获得更好的理解:

    • 由于 NOT_EQUAL 和 IN 运算符是通过多个查询实现的,因此使用它们的查询不支持游标,也不支持使用 CompositeFilterOperator.or 方法构造的复合查询。
    • 对于在具有多个值的属性上使用不等式过滤器或排序顺序的查询,游标并不总是按预期工作。此类多值属性的重复数据删除逻辑在检索之间不会持续存在,可能会导致多次返回相同的结果。

    如果IN 中使用的值列表是静态列表,而不是在运行时确定,解决方法是在编写实体时将其计算为索引布尔字段。这允许您使用单个相等过滤器。例如,如果您有一个错误跟踪器并且想要查看未解决问题的列表,则可以对查询使用IN('new', 'open', 'assigned') 限制。或者,您可以将一个名为 is_open 的属性设置为 True,这样您就不再需要 IN 条件了。


    * 计算愚蠢:需要对无限数量的先前值进行线性扫描,以确定当前检索到的实体是否是重复的。也称为概念上与游标不兼容。

    ** Key 之所以有效,是因为我们可以在不同的单个查询之间交替检索下一组值,而不必担心对整个正在进行的结果集进行线性扫描。这为我们提供了一个可以使用的有界数据集。

    【讨论】:

    • 谢谢,我会尝试一下 flag 的想法,看看能否让它做我想做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多