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

2024-04-26

用户在他的移动设备上访问他的联系人。我想将所有电话号码(例如 250)发送回服务器,然后查询具有匹配电话号码的任何用户实体。

用户有一个已索引的电话字段。所以我这样做User.query(User.phone.IN(phone_list)),但我刚刚看了 AppStats,这该死的贵吗?这一操作花费了我 250 次读取时间,这是我希望用户经常做的事情。

有哪些替代方案?我想我可以将用户实体的 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 模型。您可以使用后挂钩来做到这一点:https://developers.google.com/appengine/docs/python/ndb/modelclass#Model__post_delete_hook https://developers.google.com/appengine/docs/python/ndb/modelclass#Model__post_delete_hook

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐