3

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

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

有哪些替代方案?我想我可以将 User 实体的 id 值设置为他的电话号码(即在创建用户时我会这样做user = User(id = phone_number)),然后通过键直接获取ndb.get_multi(phones),但我也想对电子邮件执行相同的查询。

有任何想法吗?

4

3 回答 3

2

您可以像这样创建一个 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

于 2012-10-19T16:37:00.100 回答
0

我误解了你的问题的一部分,我以为你发出的查询是给你 250 个实体。

我知道现在的问题是什么,您正在发出一个包含 250 个电话号码列表的 IN 查询,在幕后,数据存储实际上正在执行 250 个单独的查询,这就是您获得 250 个读取操作的原因。

我想不出办法来避免这种情况。我建议避免搜索一长串电话号码。这似乎是您只需要做一次的事情,即用户第一次使用该手机登录时。尝试找到一些方法来存储结果并避免再次查询。

于 2012-10-19T18:32:24.017 回答
0

没有有效的方法来进行 IN 查询。因此,请避免一起使用。

如何?

反转查询,而不是查找属于人电话列表的所有人。

尝试

查找所有在他们的列表中有此用户 phoneid 的人。

然而,这并非没有一些额外的费用。每个用户的电话清单都可以存储和索引。

class User(ndb.Model):
  phoneList = ndb.PropertyList()
  phone_id= ndb.StringProperty()

select from where User.phoneList = :this_phone_number
于 2014-02-28T01:05:03.147 回答