3

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

2 回答 2

3

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

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

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

于 2012-11-15T14:53:41.833 回答
1

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

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

于 2012-11-15T05:20:13.163 回答