【问题标题】:BadFilterError: invalid filter: Only one property per query may have inequality filters (<=, >=, <, >)BadFilterError:无效过滤器:每个查询只有一个属性可能有不等式过滤器(<=、>=、<、>)
【发布时间】:2012-11-15 05:03:28
【问题描述】:

我正在尝试对两个不同的属性应用过滤器,但 GAE 不允许我这样做,那么解决方案是什么,代码片段如下:

if searchParentX :
    que.filter("parentX >=", searchParentX).filter("parentX <=", unicode(searchParentX) + u"\ufffd") 
    que.order('parentX')   

if searchParentY :
    que.filter("parentY >=", searchParentY).filter("parentY <=", unicode(searchParentY) + u"\ufffd") 

【问题讨论】:

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


    【解决方案1】:

    解决方案是进行内存过滤:

    1. 您可以运行两个查询(每个过滤一个属性)并对结果进行交集(根据数据的大小,您可能需要限制一个查询的结果而不是另一个查询,以便它适合记忆)
    2. 运行一个查询并过滤掉内存中的另一个属性(在这种情况下,如果您知道哪个属性会返回更多过滤列表,这将是有益的)

    或者,如果您的数据结构可以将数据分成多个集合,您可以对该集合执行相等过滤器并在内存中完成过滤。例如,如果您正在搜索字符串,但您知道字符串的长度是固定的(比如 6 个字符),则可以创建一个包含 3/4 个字符的“查找”字段。然后当你需要在这个字段上搜索时,你通过匹配前几个字符来完成,并在内存中完成搜索。另一个例子:在搜索整数范围时,如果您可以定义常见的范围分组(比如一年的几十年或价格范围),那么您可以定义一个“范围”字段来进行相等搜索并继续在内存中进行过滤

    【讨论】:

      【解决方案2】:

      不等式过滤器最多限制一个属性,我认为这个限制是因为 bigtable 中的数据以词法排序形式存储,因此一次只能执行一次搜索

      https://developers.google.com/appengine/docs/python/datastore/queries#Restrictions_on_Queries

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        相关资源
        最近更新 更多