GAE NDB使用游标排序多分数

时间:2016-04-07 13:46:41

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

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

BadArgumentError: _MultiQuery with cursors requires __key__ order

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

1 个答案:

答案 0 :(得分:0)

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

由于可以在这些单个查询中的一个或多个中返回相同的实体,因此合并这些值在计算上会变得愚蠢*,除非您按密钥**进行排序。

相关,您应该阅读underlying caveats/limitations on cursors以更好地理解:

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

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

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

**密钥有效,因为我们可以在检索下一组值的不同单个查询之间进行切换,而不必担心对整个进程结果集进行线性扫描。这为我们提供了一个可以使用的有限数据集。