3

ユーザーが自分のモバイル デバイスで自分の連絡先にアクセスします。すべての電話番号 (250 など) をサーバーに送り返し、電話番号が一致するユーザー エンティティをクエリします。

ユーザーには、索引付けされた電話フィールドがあります。だから私はそうしますUser.query(User.phone.IN(phone_list))が、AppStatsを見ただけで、これは非常に高価です. この 1 回の操作で 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')])

この状況でうまくいくと思います。User を更新するたびに PhoneUser モデルを追加/削除するだけです。ポスト フックを使用してこれを行うことができます: 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 に答える