1

我正在使用 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'

这与祖先的地位有关。该答案能够在一种情况下指出解决方案,但该解决方案不适用于此处,因为祖先位于实际的 AND 子句中。

  1. 如何重新格式化此查询以使其正常工作?
  2. 这个查询是个坏主意吗?是不是太复杂了?由于它的复杂性,它会花费我比平时更多的阅读费用吗?
4

2 回答 2

1

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

编辑

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

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

建议 如果您还将祖先对象修改为模型属性,则可以执行您想要的查询。例如

class Club(ndb.Model):
    parent = ndb.KeyProperty()
于 2012-09-19T16:36:43.557 回答
1

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

于 2012-09-19T22:09:09.027 回答