【问题标题】:Datastore Query filtering on list列表中的数据存储查询过滤
【发布时间】:2011-01-25 17:23:10
【问题描述】:

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

如何制作:

query = Story.all()

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

【问题讨论】:

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


    【解决方案1】:

    在 App Engine 中无法有效地做到这一点。您应该简单地选择没有该过滤器的所有内容,并过滤掉代码中的任何匹配实体。

    【讨论】:

      【解决方案2】:

      现在通过 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'),那么 将它们合并为一个结果集。

      来源:appengine blog

      【讨论】:

      • 有趣的注释:您上面提到的博客是由撰写所选答案的同一个人撰写的。
      【解决方案3】:

      这是一个老问题,所以我不确定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) 更多的操作会增加您的成本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        相关资源
        最近更新 更多