[英]Efficient way to do large IN query in Google App Engine?
用戶在他的移動設備上訪問他的聯系人。 我想將所有電話號碼(例如250)發送回服務器,然后查詢具有匹配電話號碼的任何用戶實體。
用戶具有索引的電話字段。 所以我做User.query(User.phone.IN(phone_list))
,但我只是看了AppStats,這真是太貴了。 對於這一項操作,我花了250次讀取,這是我希望用戶經常做的事情。
有哪些替代方案? 我想我可以將User實體的id值設置為他的電話號碼(即創建用戶時我會用user = User(id = phone_number)
),然后通過ndb.get_multi(phones)
直接獲取密鑰,但是我也想用電子郵件執行相同的查詢。
有任何想法嗎?
您可以像這樣創建一個PhoneUser模型:
from google.appengine.ext import ndb
class PhoneUser(ndb.Model):
number = ndb.StringProperty()
user = ndb.KeyProperty()
class User(ndb.Model):
pass
u = User()
u.put()
p = PhoneUser(id='123-456-7890', number='123-456-7890', user=u.key)
p.put()
u2 = User()
u2.put()
p2 = PhoneUser(id='555-555-5555', number='555-555-5555', user=u2.key)
result = ndb.get_multi([ndb.Key(PhoneUser, '123-456-7890'), ndb.Key(PhoneUser, '555-555-5555')])
我認為在這種情況下會有效。 只要您更新用戶,就必須添加/刪除PhoneUser模型。 你可以使用post hooks來做到這一點: https : //developers.google.com/appengine/docs/python/ndb/modelclass#Model__post_delete_hook
我誤解了你的部分問題,我以為你發的是一個給你250個實體的查詢。
我現在看到問題是什么,你發出了一個包含250個電話號碼列表的IN查詢,在幕后,數據存儲區實際上正在進行250次單獨查詢,這就是為什么你要獲得250個讀取操作。
我想不出辦法避免這種情況。 我建議不要搜索很長的電話號碼列表。 這似乎是用戶首次使用該手機登錄時需要執行的操作。 嘗試找到一些方法來存儲結果並再次避免查詢。
沒有有效的方法來進行IN查詢。 所以反而避免一起。
怎么樣?
反轉查詢,而不是找到屬於這個家伙電話列表的所有人。
嘗試
發現在他們的名單這個用戶phoneid所有的人。
然而,這並非沒有一些額外的費用。 每個用戶的phonelist都被存儲和索引。
class User(ndb.Model):
phoneList = ndb.PropertyList()
phone_id= ndb.StringProperty()
select from where User.phoneList = :this_phone_number
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.