我有一个地址列表作为字符串类型,我想找到其位置值与列表内容匹配的所有事件。因为我有数以千计的这样的条目,所以使用带过滤器的'IN'将无法正常工作,因为我超过了30项/ fetch的限制。
以下是我尝试过滤器的方法:
# addresses come in as list of string items
addresses = ['123 Main St, Portland, ME', '500 Broadway, New York, NY', ...];
query = Event.all();
query.filter('location IN ', addresses);
# above causes the error:
<class 'google.appengine.api.datastore_errors.BadArgumentError'>:
Cannot satisfy query -- too many subqueries (max: 30, got 119).
Probable cause: too many IN/!= filters in query.
我的模特课程:
class Event(GeoModel):
name = db.StringProperty();
location = db.PostalAddressProperty();
有没有更好的方法来查找符合特定条件的所有条目?
答案 0 :(得分:3)
除了多个查询之外,没有办法解决这个问题 - 毕竟,您要求针对不同地址的一组查询的组合结果,这就是在数据存储区中实现'IN'查询的方式。您可能需要考虑使用ndb或异步查询,以便可以并行运行它们。
也许如果你解释一下你想要实现的目标,我们可以建议一种更有效的方法。
答案 1 :(得分:0)
一个简单的解决方案/(hack)就是将你的地址列表分成30个列表。每30个位置执行1次查询,然后获取查询结果的交集,以获取原始列表中每个位置的事件。
答案 2 :(得分:-1)
GQL'IN'不允许超过30个子查询。为此,我将子查询划分为小块,少于或等于30个子查询,并将结果存储到数组中。
main