列表上的数据存储区查询过滤

时间:2010-03-10 02:12:23

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

选择所有记录,ID不在列表中

如何制作:

query = Story.all()

query.filter('ID **NOT IN** =', [100,200,..,..])

3 个答案:

答案 0 :(得分:3)

在App Engine中无法有效地执行此操作。您应该只选择没有该过滤器的所有内容,并过滤掉代码中的任何匹配实体。

答案 1 :(得分:2)

现在通过GQL查询支持

  

Python运行时中的'IN'和'!='运算符实际上是   在SDK中实现并转换为多个查询   罩”。

     

例如,查询“SELECT * FROM People WHERE name IN('Bob',   '简')“被翻译成两个查询,相当于运行   “SELECT * FROM People WHERE name ='Bob'”和“SELECT * FROM People   WHERE name ='Jane'“并合并结果。结合多个   disjunctions乘以所需的查询数,因此查询   “SELECT * FROM People WHERE name IN('Bob','Jane')和年龄!= 25”   为每个可能的条件生成总共四个查询   (年龄小于或大于25岁,姓名为'Bob'或'Jane'),然后   将它们合并为一个结果集。

来源:appengine blog

答案 2 :(得分:0)

这是一个老问题,所以我不确定ID是否属于非关键属性。但为了回答这个问题:

query = Story.all()
query.filter('ID **NOT IN** =', [100,200,..,..])

...使用ndb模型,您绝对可以查询列表中的项目。例如,请参阅IN!=的文档here。以下是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]

一些警告:

那里的文档提到,为了执行这些类型的查询,数据存储区在幕后执行多个查询,(1)可能需要一段时间才能执行,(2)如果您搜索需要更长时间在重复的属性中,(3)通过更多操作来增加成本。