數據建模我作爲字符串類型的地址的列表,我想找到其位置值列表中的內容匹配的所有事件。因爲我有成千上萬的這樣的條目,所以在過濾器中使用'IN'將不起作用,因爲我已經超過了30項/獲取的限制。與AppEngine上的Python和查詢與「IN」範圍
以下是我試圖做一個過濾器:
# 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();
有沒有更好的辦法找到符合特定條件的所有條目?
許多總實體您如何在數據存儲中。在內存中進行過濾幾乎是有意義的,或者如果要匹配的地址列表始終保持相同,則可以執行map-reduce作業以在實體中設置布爾屬性,以顯示實體是否與地址匹配名單。 IN查詢本身實際上在幕後進行了30次查詢;沒有辦法有效地進行這樣的查詢。 – geoffspear
總條目是動態的 - 可能很少,可能會很多。在100 - 10K的範圍內。也許地圖縮小是這項任務的一個好選擇。 –
@DanHolman根據您的使用情況,Map Reduce看起來非常合適。請記住,IN查詢實際上爲每個參數運行1個查詢(因此,30個元素限制),這不僅速度慢,而且對配額使用率有巨大影響。 – marianosimone