在Google App Engine中使用嵌套的AND / OR执行祖先查询

时间:2012-09-19 16:15:39

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

我正在使用Google App Engine NDB,并尝试执行以下查询:

query = Club.query(ndb.OR(
ndb.AND(Club.memberIds == userId, Club.modifiedDate > date), 
ndb.AND(Club.activityDate > date, ancestor = userKey)
))

但是,我收到运行时错误:

TypeError: __new__() got an unexpected keyword argument 'ancestor'

它与祖先的位置有关。 This answer能够在一个案例中指出解决方案,但该解决方案不适用于此,因为祖先在实际的AND子句中。

  1. 如何重新格式化此查询?
  2. 这个查询是个坏主意吗?太复杂了吗?由于它的复杂性,它会比平常花费更多的额外费用吗?

2 个答案:

答案 0 :(得分:1)

是否可以重写查询以使用GQL?

修改

击落我自己的建议。无法重写查询以使用GQL。 GQL不支持OR

请参阅:https://developers.google.com/appengine/docs/python/datastore/gqlreference

<强> SUGGESTION 如果还将祖先对象修改为“模型”属性,则可以执行所需的查询。 E.g。

class Club(ndb.Model):
    parent = ndb.KeyProperty()

答案 1 :(得分:1)

您不能将祖先用作过滤器的一部分;它必须是query()调用上的关键字参数。目前,OR查询无论如何都会变成多个查询,因此OR()方法给您带来的唯一好处是更容易组合结果。但是为了工作你必须按键排序,并且编写一个小合并函数来合并按键排序的两组查询结果是微不足道的。 (也可以通过调用ndb.query._MultiQuery()来完成它,但后者不是一个记录的API,而且很难做到正确,所以最好自己这样做。)