繁体   English   中英

在Google App Engine中进行大型IN查询的有效方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM