BadFilterError:无效过滤器:每个查询只有一个属性可能有不等过滤器(< =,> =,<,>)

时间:2012-11-15 05:03:29

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

我正在尝试对两个不同的属性应用过滤器,但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") 

2 个答案:

答案 0 :(得分:3)

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

  1. 您可以运行两个查询(分别对一个属性进行过滤)并对结果执行交集(根据数据的大小,您可能需要限制一个查询的结果而不是另一个查询的结果,以便它可以适合存储器)
  2. 运行一个查询并过滤掉内存中的其他属性(在这种情况下,如果您知道哪个属性会返回更多已过滤的列表,那将是有益的)
  3. 或者,如果您的数据的结构使您可以将数据分成几组,则可以对该组执行相等过滤并在内存中完成过滤。例如,如果您正在搜索字符串但您知道字符串是固定长度(例如6个字符),则可以创建一个“查找”字段,其中包含乞讨的3/4字符。然后,当您需要搜索此字段时,您可以通过匹配前几个字符来完成搜索,并在内存中完成搜索。另一个例子:当搜索整数范围时,如果你可以定义范围的常见分组(比如一年的几十年或价格范围),那么你可以定义一个“范围”字段来进行相等搜索并继续在内存中过滤

答案 1 :(得分:1)

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

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