在ndb中,如何查询属性A不在列表B中的项目?

时间:2013-11-30 20:16:59

标签: google-app-engine app-engine-ndb

在ndb中,为了查询属性A在列表B中的项目,您可以执行以下操作:

Item.query(Item.A.IN(B))

如何在列表B中查询属性A 的项目?

2 个答案:

答案 0 :(得分:9)

这是不可能的。请注意,对于列表B中的每个项目,您的IN查询实际上会自动分解为多个不同的EQUALS查询,并返回合并的结果。

您可以查询所有内容,然后手动过滤掉并忽略列表B中的结果。

典型的GAE解决方案是对另一个易于索引和查询的值进行非规范化和预计算,并将其保存为Item中的属性。

答案 1 :(得分:3)

永远不要说永远!

通过构建一系列' x!= y AND x!= z' ndb过滤器,我们可以模拟一个“不是”的过滤器。查询:例如(1):

checkList = ['cookieAck', 'newkey', 'tempCelsius']
query = UserSetting.query(Setting.name!=checkList[0])
for check in checkList[1:]:
  query = query.filter(ndb.AND(UserSetting.name!=check))

settings = query.fetch()

实际上,这看起来像以下手动构造的查询(2):

  query = UserSetting.query(ndb.AND(ndb.AND(UserSetting.name!='cookieAck', UserSetting.name != 'newkey'), UserSetting.name != 'tempCelsius'))

请注意,只需执行以下操作也可以(3):

query = UserSetting.query(UserSetting.name!='cookieAck', UserSetting.name != 'newkey', UserSetting.name != 'tempCelsius')

结果查询:

Query(kind='UserSetting', filters=OR(AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '>', 'tempCelsius')), AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '>', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '>', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '>', 'tempCelsius'))))