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

Google app engine 在ndb中,如何查询属性A不在列表B中的项目?,google-app-engine,app-engine-ndb,Google App Engine,App Engine Ndb,在ndb中,为了查询属性A位于列表B中的项目,您可以执行以下操作: Item.query(Item.A.IN(B)) 如何查询属性A不在列表B中的项目?这是不可能的。请注意,对于列表B中的每个项,IN查询实际上会自动分解为许多不同的EQUALS查询,并返回合并结果 您可以查询全部,然后手动筛选并忽略列表B中的结果 一个典型的GAE解决方案是对另一个易于索引和查询的值进行反规范化和预计算,并将其保存为项中的属性。永不说永不 通过构造一系列的x=y和x=z'ndb过滤器,我们可以模拟“不在”查询:

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

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

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

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

您可以查询全部,然后手动筛选并忽略列表B中的结果

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

永不说永不

通过构造一系列的x=y和x=z'ndb过滤器,我们可以模拟“不在”查询:例如(1):

实际上,这类似于以下手动构造的查询(2):

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

结果查询:

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'))))
Query(kind='UserSetting',filters=OR(AND(FilterNode('name','','tempcices')))

我不确定这是否是一个好的解决方案,因为查询可能会很慢,但它似乎确实有效。
  query = UserSetting.query(ndb.AND(ndb.AND(UserSetting.name!='cookieAck', UserSetting.name != 'newkey'), UserSetting.name != 'tempCelsius'))
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'))))