0

我想知道为什么您需要在投影查询中包含某些属性。我正在尝试获取不同的“foo”属性列表。

Object.query(projection=[Object.foo], distinct=True) \
    .filter(Object.username == user.nickname()) \
    .filter(Object.bar >= value) \
    .fetch()

即使建议的索引已启动并正在运行,这也会产生 NeedIndexError。原因是基于 bar >= value 的第二个过滤器。通过删除该过滤器,查询可以完美运行,但没有达到目标。

Object.query(projection=[Object.foo, Object.bar], distinct=True) \
    .filter(Object.username == user.nickname()) \
    .filter(Object.bar >= value) \
    .fetch()

这个可行,但现在你没有只有不同 foo 的结果,而是 foo 和 bar 的 carthesian 乘积。这不是我们最初的目标。

Object.query() \
    .filter(Object.username == user.nickname()) \
    .filter(Object.bar >= value) \
    .fetch(projection=[Object.foo])

这也有效,但无法按“foo”分组,从而导致列表具有重复的“foo”值。

正如您在上面看到的,有解决此问题的方法,但两者都会导致更大的响应列表。如果可能的话,我想避免这种情况。因此,我有两个问题:

  1. 为什么 filter() 中的属性有时需要包含在投影中?这对我来说没有意义。另外,为什么这会导致 NeedIndexError 而不是更合适的结果?
  2. 有没有没有上述缺点的解决方案?或者,也许我从错误的角度解决了这个问题?欢迎任何建议。
4

1 回答 1

0

这是索引推荐系统的一个错误,应该在 App Engine 1.8.6 版本中修复。问题是为了提供不同的属性,这些属性必须在排序顺序中排在第一位。请注意,不等式也必须在排序顺序中排在第一位。因此,如果您有不等式和不同的投影,则它们必须位于同一属性上。

投影必须在过滤器中的唯一原因是您正在请求不同的属性。您真的可以将其视为对同一属性的 group by 的投影。为了进行这种分组,必须对属性进行排序以提供有效的重复数据删除。

执行所需查询的唯一方法是在内存中执行一些操作(正如您在问题中提到的那样)。另一种选择是没有不等式过滤器,然后在内存中进行此过滤。

如果您升级到 1.8.6 SDK,您应该开始收到更好的(-ish)错误消息。

于 2013-10-24T17:18:02.373 回答