在我的GAE应用中,我正在进行必须按日期排序的查询。查询必须包含IN过滤器,但这会导致以下错误:
BadArgumentError: _MultiQuery with cursors requires __key__ order
现在我已经阅读了其他SO问题(like this one),建议改为按键排序(因为错误也指出)。然而,问题是查询对于其目的而言变得无用。它需要按日期排序。有什么方法可以实现这个目标?
答案 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
条件。
*计算上很愚蠢:需要对无限数量的先前值进行线性扫描,以确定当前检索到的实体是否重复。也称为概念上与游标不兼容。
**密钥有效,因为我们可以在检索下一组值的不同单个查询之间进行切换,而不必担心对整个进程结果集进行线性扫描。这为我们提供了一个可以使用的有限数据集。