【发布时间】:2011-01-25 17:23:10
【问题描述】:
选择所有记录,ID不在列表中
如何制作:
query = Story.all()
query.filter('ID **NOT IN** =', [100,200,..,..])
【问题讨论】:
标签: google-app-engine google-cloud-datastore
选择所有记录,ID不在列表中
如何制作:
query = Story.all()
query.filter('ID **NOT IN** =', [100,200,..,..])
【问题讨论】:
标签: google-app-engine google-cloud-datastore
在 App Engine 中无法有效地做到这一点。您应该简单地选择没有该过滤器的所有内容,并过滤掉代码中的任何匹配实体。
【讨论】:
现在通过 GQL 查询支持这一点
Python 运行时中的 'IN' 和 '!=' 运算符实际上是 在 SDK 中实现并转换为多个查询 引擎盖'。
例如,查询“SELECT * FROM People WHERE name IN ('Bob', 'Jane')" 被翻译成两个查询,相当于运行 “SELECT * FROM People WHERE name = 'Bob'”和“SELECT * FROM People WHERE name = 'Jane'" 并合并结果。结合多个 析取乘以所需查询的数量,因此查询 “SELECT * FROM People WHERE name IN ('Bob', 'Jane') AND age != 25” 为每个可能的条件生成总共四个查询 (年龄小于或大于 25 岁,名字是 'Bob' 或 'Jane'),那么 将它们合并为一个结果集。
【讨论】:
这是一个老问题,所以我不确定ID 是否是非关键属性。但是为了回答这个问题:
query = Story.all()
query.filter('ID **NOT IN** =', [100,200,..,..])
...使用ndb 模型,您绝对可以查询列表中的项目。例如,请参阅文档 here 了解 IN 和 !=。以下是根据 OP 要求进行过滤的方法:
query = Story.filter(Story.id.IN([100,200,..,..])
我们甚至可以查询重复键列表中的项目:
def all(user_id):
# See if my user_id is associated with any Group.
groups_belonged_to = Group.query().filter(user_id == Group.members)
print [group.to_dict() for group in belong_to]
一些注意事项:
那里的文档提到,为了执行这些类型的查询,Datastore 会在后台执行多个查询,这 (1) 可能需要一段时间才能执行,(2) 如果您搜索重复的属性,则需要更长的时间, (3) 更多的操作会增加您的成本。
【讨论】: