为什么NDB属性在筛选器中使用时需要包含在投影查询中?

2024-05-16 12:40:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道为什么需要在投影查询中包含某些属性。我想得到一个不同的'foo'属性列表。在

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

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

^{pr2}$

这一个是有效的,但是现在你得到的结果不是只有不同的foos,而是foo和bar的carthesian产品。这不是我们最初的目标。在

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

这个方法也可以,但是没有办法按“foo”分组,因此会产生一个具有重复“foo”值的列表。在

你可以在上面的列表中看到两个问题的答案。如果可能的话,我想避免这种情况。因此,我有两个问题:

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

Tags: 列表属性objectfoovaluenicknameusernamebar
1条回答
网友
1楼 · 发布于 2024-05-16 12:40:35

这是索引推荐系统的一个错误,应该在AppEngine的1.8.6版本中修复。问题是,为了提供不同的属性,这些属性必须是排序顺序中的第一个。注意,一个不等式也必须是排序顺序中的第一个。所以如果你有一个不等式和一个不同的投影,它们必须在同一个性质上。在

投影必须在筛选器中的唯一原因是您正在请求不同的属性。你可以把它看作是一个在同一个属性上有一个groupby的投影。为了进行此分组,必须对属性进行排序以提供高效的重复数据消除。在

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

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

相关问题 更多 >